Go语言的net
包通过提供一系列功能丰富的API来支持TCP/IP和UDP网络通信。这些API允许开发者创建网络连接、监听端口、发送和接收数据等操作。以下将分别介绍net
包如何支持TCP/IP和UDP网络通信,并给出相应的示例。
一、TCP/IP网络通信
1. 创建TCP连接
使用
net.Dial
函数:该函数用于创建网络连接,可以指定连接的协议(如"tcp")、网络地址和端口号。成功时,返回一个net.Conn
接口类型的对象,用于后续的读写操作。示例代码:
package main import ( "fmt" "net" ) func main() { // 建立TCP连接 conn, err := net.Dial("tcp", "127.0.0.1:8080") if err != nil { fmt.Println("连接失败:", err) return } defer conn.Close() // 发送数据 _, err = conn.Write([]byte("Hello, Server!")) 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])) }
2. 创建TCP服务器
使用
net.Listen
函数:该函数用于在指定的网络地址和端口上监听连接请求,成功时返回一个net.Listener
接口类型的对象。通过调用该对象的Accept
方法,可以接收客户端的连接请求,并返回一个net.Conn
对象用于与客户端通信。示例代码(服务器端):
package main import ( "fmt" "net" ) func main() { // 创建TCP监听器 listener, err := net.Listen("tcp", "127.0.0.1:8080") if err != nil { fmt.Println("监听失败:", err) return } defer listener.Close() for { // 等待并接受客户端连接 conn, err := listener.Accept() if err != nil { fmt.Println("接受连接失败:", err) continue } // 处理连接(这里仅为示例,实际中可能需要goroutine处理) go handleConn(conn) } } func handleConn(conn net.Conn) { defer conn.Close() // 读取客户端发送的数据等操作... }
二、UDP网络通信
1. 创建UDP客户端
使用
net.DialUDP
函数:该函数用于创建UDP连接,需要指定网络协议("udp")、本地地址(可选,如果为nil,则系统自动分配)和服务器地址。成功时返回一个net.UDPConn
对象,用于后续的读写操作。示例代码(客户端):
package main import ( "fmt" "net" ) func main() { // 解析服务器地址 udpAddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:8080") if err != nil { fmt.Println("解析地址失败:", err) return } // 创建UDP连接 conn, err := net.DialUDP("udp", nil, udpAddr) if err != nil { fmt.Println("连接失败:", err) return } defer conn.Close() // 发送数据 _, err = conn.Write([]byte("Hello, Server!")) if err != nil { fmt.Println("发送数据失败:", err) return } // 接收数据(注意:UDP是无连接的,这里的接收只是演示如何读取数据) buffer := make([]byte, 1024) n, _, err := conn.ReadFromUDP(buffer) if err != nil { fmt.Println("接收数据失败:", err) return