Go net包支持TCP/UDP等协议:TCP用于可靠连接(如HTTP),UDP用于轻量实时场景(如DNS);TCP服务端用Listen+Accept并发处理,客户端用Dial收发;UDP通过ListenUDP+ReadFromUDP/WriteToUDP实现无连接通信。

Golang 的 net 包是标准库中实现网络通信的核心工具,支持 TCP、UDP、Unix 域套接字等多种协议。TCP 适用于需要可靠、有序、面向连接的场景(如 HTTP、RPC);UDP 更轻量,适合实时性要求高、能容忍丢包的场景(如 DNS 查询、音视频传输)。下面以实用方式讲解如何用 net 包编写 TCP 和 UDP 的客户端与服务器。
TCP 服务器:监听连接并处理请求
使用 net.Listen("tcp", ":8080") 启动服务,接受连接后启动 goroutine 处理每个客户端,避免阻塞后续连接。
- 监听地址格式为
"host:port",":8080"表示监听本机所有 IPv4/IPv6 地址的 8080 端口 - 每次
listener.Accept()返回一个net.Conn,代表一条 TCP 连接 - 建议对每个连接启用独立 goroutine,并注意关闭连接和错误处理
示例关键代码:
ln, _ := net.Listen("tcp", ":8080")
defer ln.Close()
for {
conn, err := ln.Accept()
if err != nil {
log.Println("Accept error:", err)
continue
}
go handleConn(conn) // 并发处理
}
TCP 客户端:主动连接并收发数据
用 net.Dial("tcp", "localhost:8080") 建立连接,返回的 net.Conn 可直接读写。
立即学习“go语言免费学习笔记(深入)”;
- Dial 会自动完成三次握手;失败时立即返回 error,无需额外连接检测
- 写入使用
conn.Write([]byte("hello")),读取用conn.Read(buf)(阻塞直到有数据或出错) - 务必调用
conn.Close()释放资源;若服务端关闭连接,Read 将返回io.EOF
UDP 服务器:无连接,基于数据报收发
UDP 不维护连接状态,用 net.ListenUDP("udp", addr) 绑定地址,通过 ReadFromUDP 和 WriteToUDP 收发数据。
- ListenUDP 的地址必须是
*net.UDPAddr类型,可用net.ResolveUDPAddr("udp", ":9000")解析 - ReadFromUDP 返回发送方地址,可用于回包;不保证送达、不保证顺序、不保证不重复
- 适合单次请求响应模型,例如简单时间同步服务或日志上报
UDP 客户端:发送请求并等待响应(可选)
客户端也用 net.ListenUDP 创建本地 socket(可指定端口,也可让系统自动分配),再用 WriteToUDP 发送,ReadFromUDP 接收响应。
- 若只发不收,可跳过 ListenUDP,直接用
net.DialUDP(但 DialUDP 仍需本地绑定,只是封装了) - 由于 UDP 无连接,客户端无法感知服务端是否存活;超时需自行控制(如设置
SetReadDeadline) - 实际项目中常配合 context 或 timer 实现超时重试逻辑










