Go语言net包提供简洁高效的并发网络编程接口,支持TCP/UDP通信;TCP服务端用Listen+Accept+goroutine处理连接,客户端用Dial连接并读写;UDP通过ListenUDP实现无连接消息传递;需重视错误处理、连接关闭和超时控制。
Go 语言的
包提供了简洁、高效、并发友好的
网络编程
接口,是实现 TCP/UDP 通信的核心工具。它屏蔽了底层系统调用细节,同时天然支持 goroutine,让高并发网络服务开发变得直观可靠。
TCP 服务端:监听与连接处理
TCP 是面向连接的协议,适合需要可靠传输的场景(如 HTTP、RPC)。使用
启动监听,再通过
获取连接,每个连接建议用独立 goroutine 处理,避免阻塞其他请求。
关键点:
监听地址格式为
或
(省略 host 表示监听所有网卡)
和
是阻塞操作,但因 goroutine 轻量,可安全并发调用
务必关闭连接(
),否则可能耗尽文件描述符
示例片段:
立即学习
“
go语言免费学习笔记(深入)
”;
goln, _ := net.Listen("tcp", ":8080")defer ln.Close()for {conn, err := ln.Accept()if err != nil { continue }go func(c net.Conn) {defer c.Close()io.Copy(c, c) // 回显数据} (conn)}
TCP 客户端:建立连接并收发数据
客户端用
主动连接服务端,返回的
接口同样支持读写。注意设置超时(如
或配合
),防止无限等待。
常见做法:
Midjourney AI 提示词工具
PHP中文网提供Midjourney AI 提示词在线生成工具,专为解决 AI 绘画“词穷”痛点而生,用户只需输入“一只猫”等简单想法,工具便能利用 AI 智能扩展出包含艺术风格、光影构图、镜头参数及负面提示词的专业级英文 Prompt。它完美兼容 Midjourney V8.1 及 Niji 模型,支持一键复制与参数自动优化,大幅降低创作门槛,是提升出图质量与效率的必备辅助神器。
下载
使用
提升文本交互效率(如按行读取)
对二进制协议,直接操作
和
错误需检查:连接失败、写入时对方已关闭、读取 EOF 等
示例:
goc, err := net.Dial("tcp", "localhost:8080")if err != nil { log.Fatal(err) }defer c.Close()c.Write([]byte("hello"))buf := make([]byte, 1024)n, _ := c.Read(buf)fmt.Printf("recv: %s", buf[:n])
UDP 通信:无连接、轻量级消息传递
UDP 不维护连接状态,适合实时性要求高、能容忍丢包的场景(如 DNS 查询、游戏心跳、日志上报)。Go 中统一用
创建端点,收发均通过
完成。
要点说明:
服务端绑定地址后,用
接收任意来源的数据包,返回发送方地址
客户端无需显式“连接”,直接用
发送,目标地址在每次调用中指定
UDP 数据报有大小限制(通常 65507
字节
),超长会被截断或丢弃
服务端示例:
goaddr, _ := net.ResolveUDPAddr("udp", ":9999")conn, _ := net.ListenUDP("udp", addr)defer conn.Close()buf := make([]byte, 1024)for {n, clientAddr, _ := conn.ReadFromUDP(buf)conn.WriteToUDP(buf[:n], clientAddr)}
错误处理与资源管理
网络操作失败非常常见,不能忽略错误。典型错误包括:
(服务未启动)、
(超时)、
(对方关闭连接)、
(未及时关闭连接)。
实用建议:
所有
和
都应确保关闭,推荐用
或显式
对长时间连接,设置
/
/
防止永久阻塞
生产环境建议结合
控制超时与取消,尤其在客户端调用中
netnet.ListenAccept"tcp:localhost:8080""tcp::8080"conn.Read()conn.Write()conn.Close()net.DialConnnet.DialTimeoutcontextbufio.Reader/Writerconn.Read([]byte)conn.Write([]byte)net.ListenUDP*UDPConnReadFromUDPWriteToUDPconnection refusedi/o timeoutbroken pipetoo many open filesnet.Conn*UDPConndeferClose()SetDeadlineSetReadDeadlineSetWriteDeadlinecontext.Context