在Go语言中,net
包提供了广泛的网络通信功能,包括TCP/IP、UDP协议、域名解析等。下面我将通过几个步骤和示例,详细说明如何在 Go 中使用 net
包来实现网络协议。
1. 创建TCP服务器
要实现一个TCP服务器,您需要使用 net.Listen
函数来监听一个端口,然后使用 Accept
方法等待客户端的连接请求。
gopackage main import ( "fmt" "net" "os" ) func main() { // 监听8080端口 ln, err := net.Listen("tcp", ":8080") if err != nil { fmt.Fprintf(os.Stderr, "错误: %v\n", err) return } defer ln.Close() for { conn, err := ln.Accept() if err != nil { fmt.Fprintf(os.Stderr, "连接错误: %v\n", err) continue } go handleConnection(conn) } } func handleConnection(conn net.Conn) { defer conn.Close() buffer := make([]byte, 1024) n, err := conn.Read(buffer) if err != nil { fmt.Fprintf(os.Stderr, "读取错误: %v\n", err) return } fmt.Printf("收到消息: %s\n", string(buffer[:n])) conn.Write([]byte("收到消息\n")) }
2. 创建TCP客户端
创建TCP客户端比较简单,使用 net.Dial
连接到服务器。
gopackage main import ( "fmt" "net" ) func main() { // 连接到服务器 conn, err := net.Dial("tcp", "localhost:8080") if err != nil { fmt.Println("错误:", err) return } defer conn.Close() // 发送数据 _, err = conn.Write([]byte("你好,服务器!")) if err != nil { fmt.Println("写入错误:", err) return } // 接收数据 buffer := make([]byte, 1024) n, err := conn.Read(buffer) if err != nil { fmt.Println("读取错误:", err) return } fmt.Println("从服务器收到:", string(buffer[:n])) }
3. 使用UDP协议
UDP不同于TCP,它是无连接的。下面是基于UDP的服务器和客户端的简单例子。
UDP服务器:
gopackage main import ( "fmt" "net" ) func main() { addr := net.UDPAddr{ Port: 8081, IP: net.ParseIP("127.0.0.1"), } conn, err := net.ListenUDP("udp", &addr) if err != nil { fmt.Println("错误:", err) return } defer conn.Close() buffer := make([]byte, 1024) for { n, remoteAddr, err := conn.ReadFromUDP(buffer) if err != nil { fmt.Println("读取错误:", err) continue } fmt.Printf("收到来自 %v 的消息: %s\n", remoteAddr, string(buffer[:n])) conn.WriteToUDP([]byte("消息已收到\n"), remoteAddr) } }
UDP客户端:
gopackage main import ( "fmt" "net" ) func main() { serverAddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:8081") if err != nil { fmt.Println("错误:", err) return } conn, err := net.DialUDP("udp", nil, serverAddr) if err != nil { fmt.Println("连接错误:", err) return } defer conn.Close() _, err = conn.Write([]byte("你好,UDP服务器!")) if err != nil { fmt.Println("写入错误:", err) return } buffer := make([]byte, 1024) n, _, err := conn.ReadFromUDP(buffer) if err != nil { fmt.Println("读取错误:", err) return } fmt.Println("从服务器收到:", string(buffer[:n])) }
这些示例展示了如何在Go中使用 net
包创建TCP和UDP的服务器与客户端。通过这些基本的构建块,您可以构建更复杂的网络通信应用。
2024年8月9日 03:06 回复