如何使用Golang net实现网络通信_TCP和UDP客户端服务器

14次阅读

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

如何使用Golang net实现网络通信_TCP和UDP客户端服务器

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) 绑定地址,通过 ReadFromUDPWriteToUDP 收发数据。

  • ListenUDP 的地址必须是 *net.UDPAddr 类型,可用 net.ResolveUDPAddr("udp", ":9000") 解析
  • ReadFromUDP 返回发送方地址,可用于回包;不保证送达、不保证顺序、不保证不重复
  • 适合单次请求响应模型,例如简单时间同步服务或日志上报

UDP 客户端:发送请求并等待响应(可选)

客户端也用 net.ListenUDP 创建本地 socket(可指定端口,也可让系统自动分配),再用 WriteToUDP 发送,ReadFromUDP 接收响应。

  • 若只发不收,可跳过 ListenUDP,直接用 net.DialUDP(但 DialUDP 仍需本地绑定,只是封装了)
  • 由于 UDP 无连接,客户端无法感知服务端是否存活;超时需自行控制(如设置 SetReadDeadline
  • 实际项目中常配合 context 或 timer 实现超时重试逻辑

text=ZqhQzanResources