UDP

在上一节中我们已经介绍了 Go net 包的 TCP 的用法,那么今天我们就来讲讲 net 中另外一个传输层协议 UDP 的用法。

UDP 名叫用户数据报协议(英语:User Datagram Protocol,缩写:UDP;又称用户数据包协议)是一个简单的面向数据报的通信协议,和 TCP 一样,它也是位于IP 层和应用层之间的传输层,它是主要应用层协议 FTP、QUIC、RTP 等的底层支持。

参见 TCP/IP 4 层的分层图:

4layer.png

基本知识

UDP 相较于 TCP 简单的多,它具有以下特点:

  • 无连接的

  • 要求系统资源较少

  • UDP 程序结构较简单

  • 基于数据报模式

  • UDP 可能丢包

  • UDP 不保证数据顺序性

核心 API 如下:

  • 创建 UDP Server:

注意: ListenUDP 方法,其实是创建一个 UDPConn,我们可以通过此 UDPConn 来收发包,收包的时候可以获取客户端的地址。

  • 接收数据:

注意: 返回数据的 addr 就是数据包发送的地址,从而可以根据此地址来回复客户端信息。

  • 发送数据:

  • 设置读超时时间:

  • 设置写超时时间:

注意: SetReadDeadlineSetWriteDeadline 方法的参数为具体的时刻,而不是时间间隔(time.Duration)。

  • 关闭连接:

注意:连接用完之后,需要通过此方法来进行资源释放,不然会出现句柄泄露的问题。

  • 客户端创建 UDP 连接:

Dial 其实是 net 包的一个辅助方法,它不仅支持 tcp 的连接创建,还支持 udp, ip, unix,它等价于以下操作:

实战示例

下面我们通过一个统计服务在线人数的例子来了解它的用法:

  • server/main.go

注意: 1. 监听本地 UDP 127.0.0.1:3000。 2. 使用 pc.ReadFrom(buf) 方法读取客户端发送的消息。 3. 使用 clients 来保存所有连上的客户端连接。 4. 通过 pc.WriteTo([]byte("pong"), addr) 向所有客户端发送消息。

  • client/main.go

当我运行代码可以得到如下输出:

参考资料:

最后更新于

这有帮助吗?