Go net包开箱即用但需手动处理超时、并发、错误和连接生命周期;TCP服务需goroutine并发处理conn并显式设Deadline;Dial应配超时避免卡顿;UDP无连接,ListenUDP可收发任意地址,DialUDP绑定远端;安全关闭需WaitGroup等待活跃连接结束。
Go 的
包开箱即用,适合快速构建 TCP/UDP 服务和客户端,但直接调用底层接口容易忽略连接生命周期、超时控制和错误处理细节。
如何用
启动一个基础 TCP 服务
返回
,它本身不处理连接逻辑,只负责接受新连接。常见错误是忘记用
或在循环中未对每个
启动 goroutine 导致阻塞。
监听地址格式必须带端口,如
或
;写成
会报
建议显式设置读写超时:在
上调用
和
,否则空闲连接可能长期滞留
典型结构是
,不加
就变成串行处理,无法并发
为什么
连接失败后常卡住几秒
默认情况下
没有超时,DNS 解析失败或目标端口无响应时会等系统默认 timeout(Linux 通常 30 秒)。这不是 bug,而是设计上把超时控制权交给使用者。
改用
,例如
更推荐用
配合
:构造
,再调用
注意:即使设置了超时,如果 DNS 解析慢(比如 /etc/resolv.conf 配了多个 slow nameserver),仍可能卡在解析阶段 —— 此时需配合
自定义超时
UDP 编程中
和
的关键区别
TCP 是面向连接的,UDP 是无连接的,所以
返回的
可同时收发;而
创建的连接“绑定”了远端地址,
不能用,只能用
。
go语言参考手册 中文CHM版
Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。本文给大家带来Go参考手册,需要的可以来下载! Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源,在2012年早些时候发布了Go 1稳定版本。现在Go的开发已经是完全开放的,并且拥有一个活跃的社区。 Go 语言特色 简洁、快速、安全 并行、有趣、开源 内存管理、v数组安全、编译
下载
立即学习
“
go语言免费学习笔记(深入)
”;
常用于服务器:用
接收任意来源数据,用
回复指定地址
更适合客户端场景:比如向 NTP 服务器发请求,之后所有
默认发给同一地址,
只收该地址的响应
UDP 没有内置重传和顺序保证,应用层若需可靠传输,得自己实现序列号、ACK 和重发逻辑
如何安全关闭正在运行的
直接调用
不会中断已建立的
,但后续
会返回
。真正的难点在于等待已有连接处理完成。
不要在
后立刻退出程序,否则活跃
可能被强制断开
常用做法是用
记录活跃连接数:每次
后
,
结束前
关闭流程应为:
→ 启动 goroutine 调用
→ 再退出;也可结合
防止无限等待
net 包足够轻量,但也因此把很多责任留给了开发者:超时、重试、连接池、TLS 封装都得自己补全。一个小而完整的网络服务,往往 80% 的代码不在
或
,而在围绕它们构建的错误恢复和资源管理逻辑里。
netnet.Listennet.Listennet.Listenerdefer ln.Close()conn"localhost:8080"":8080""8080""listen tcp: address 8080: missing port in address"connSetReadDeadlineSetWriteDeadlinefor { conn, err := ln.Accept(); go handle(conn) }gonet.Dialnet.Dialnet.DialTimeoutnet.DialTimeout("tcp", "example.com:80", 5*time.Second)net.DialerContext&net.Dialer{Timeout: 3*time.Second, KeepAlive: 30*time.Second}dialer.DialContext(ctx, "tcp", addr)net.Resolvernet.ListenUDPnet.DialUDPnet.ListenUDP*net.UDPConnnet.DialUDPWriteToUDPWriteListenUDPReadFromUDPWriteToUDPDialUDPWriteReadnet.Listenerln.Close()connAccept()ErrClosedln.Close()connsync.WaitGroupAcceptwg.Add(1)handlewg.Done()ln.Close()wg.Wait()context.WithTimeoutListenDial