net包是golang网络编程核心,支持TCP、udp等协议。通过net.Listen创建TCP服务器,net.Dial实现客户端通信,使用goroutine处理并发连接;UDP则用net.ListenPacket和ResolveUDPAddr实现无连接通信;需注意地址解析、错误处理及设置读写超时,及时关闭连接以避免资源泄漏。

在golang中,net包是实现网络通信的核心工具,支持TCP、UDP、unix域套接字等协议。它提供了简洁的API来创建服务器和客户端,适合构建高性能的网络服务。
使用TCP实现基本通信
TCP是一种可靠的面向连接的协议,适用于需要稳定传输的场景。通过net.Listen启动一个TCP服务器,监听指定地址和端口。
服务器示例:
func startServer() {
listener, err := net.Listen(“tcp”, “:8080”)
if err != nil {
log.Fatal(err)
}
defer listener.Close()
for {
conn, err := listener.Accept()
if err != nil {
continue
}
go handleConnection(conn)
}
}
func handleConnection(conn net.Conn) {
defer conn.Close()
buffer := make([]byte, 1024)
n, _ := conn.Read(buffer)
fmt.Println(“收到:”, String(buffer[:n]))
conn.Write([]byte(“已收到消息”))
}
客户端通过net.Dial连接服务器并发送数据:
立即进入“豆包AI人工智官网入口”;
立即学习“豆包AI人工智能在线问答入口”;
func startClient() {
conn, err := net.Dial(“tcp”, “localhost:8080”)
if err != nil {
log.Fatal(err)
}
defer conn.Close()
conn.Write([]byte(“你好,服务器”))
buffer := make([]byte, 1024)
n, _ := conn.Read(buffer)
fmt.Println(“响应:”, string(buffer[:n]))
}
处理UDP通信
UDP是无连接协议,适合对实时性要求高但可容忍部分丢包的场景,如音视频传输。
UDP服务器使用net.ListenPacket监听:
func startUDPServer() {
addr, _ := net.ResolveUDPAddr(“udp”, “:9000”)
conn, _ := net.ListenUDP(“udp”, addr)
defer conn.Close()
buffer := make([]byte, 1024)
n, clientAddr, _ := conn.ReadFromUDP(buffer)
fmt.Println(“收到UDP:”, string(buffer[:n]))
conn.WriteToUDP([]byte(“UDP响应”), clientAddr)
}
UDP客户端示例:
func sendUDP() {
addr, _ := net.ResolveUDPAddr(“udp”, “localhost:9000”)
conn, _ := net.DialUDP(“udp”, nil, addr)
defer conn.Close()
conn.Write([]byte(“UDP消息”))
buffer := make([]byte, 1024)
conn.Read(buffer)
fmt.Println(“UDP回复:”, string(buffer))
}
解析地址与错误处理
在实际应用中,需正确解析网络地址。使用net.ParseIP验证IP,net.ResolveTCPAddr或ResolveUDPAddr解析具体地址。
常见错误包括端口被占用、权限不足、连接超时。建议始终检查返回的Error值,并合理设置超时:
conn.SetReadDeadline(time.Now().Add(5 * time.Second))
conn.SetWriteDeadline(time.Now().Add(5 * time.Second))
这样可以避免程序长时间阻塞。
并发与资源管理
每个新连接应交给独立的goroutine处理,保证服务器能同时服务多个客户端。
注意及时关闭连接(conn.Close()),防止文件描述符泄漏。大型服务建议结合context控制生命周期。
基本上就这些。net包设计简洁,配合Go的并发模型,很容易写出高效稳定的网络程序。关键在于理解不同协议的特点,并做好连接管理和错误恢复。不复杂但容易忽略细节。


