UDP通信中,DatagramSocket负责无连接、不可靠的数据报收发,发送端用无参构造并依赖DatagramPacket封装目标地址与端口后send;接收端必须绑定固定端口并用receive()阻塞等待,双方端口需严格匹配。

UDP通信中,DatagramSocket 是核心类,负责数据报的收发,它不维护连接状态,也不保证送达或顺序——只管“扔出去”或“接住”。关键在于:发送和接收都依赖 DatagramPacket 封装/解析数据,而 DatagramSocket 本身只是通道。
发送端:三步打包+发出
发送方不需要提前绑定端口(系统自动分配),重点是把目标地址、端口和数据一起塞进数据包:
- 创建
DatagramSocket实例(无参构造即可) - 用目标 IP(如
InetAddress.getByName("192.168.1.66")或127.0.0.1)和端口号(如10086)构造DatagramPacket,同时传入字节数组数据 - 调用
socket.send(packet)发出;完成后建议close()
注意:发送时使用的本机端口是系统随机分配的动态端口(比如 57057),这个端口会自动成为后续可能收到回包的目标端口。
接收端:必须显式绑定端口
接收方必须指定监听端口(如 new DatagramSocket(5000)),否则无法被其他设备定位。流程更强调“等待”:
- 创建
DatagramSocket并绑定固定端口(服务端角色) - 准备一个足够大的字节数组(常用
new byte[1024]或65508上限),用它构造空DatagramPacket(仅含缓冲区) - 调用
socket.receive(packet)阻塞等待,直到有数据到达 - 从
packet.getData()和packet.getLength()提取真实内容,packet.getAddress()和packet.getPort()可获知来源
常见做法是用 while(true) 循环持续接收,适合服务器长期运行场景。
端口与地址细节不能错
UDP靠“目的IP + 目的端口”寻址,任何一项不匹配就收不到:
-
127.0.0.1是本机回环地址,不走物理网卡;localhost默认等价,但某些环境需确认 DNS 解析 -
InetAddress.getLocalHost()返回本机实际局域网 IP(如192.168.1.100),适合局域网设备互发 - 双方端口号要对得上:发送目标端口 = 接收绑定端口;若想双向通信,接收方回包时应发往
packet.getPort()(即对方源端口) - 单个 UDP 数据包最大有效载荷为
65508字节(IPv4 头部限制),超长需分片应用层处理
线程与资源管理要点
UDP 本身无连接,但编程时需注意运行模型:
- 接收端若只调用一次
receive(),收完就退出;长期服务必须循环或另起线程 - 发送端调用
close()后不能再发;接收端关闭后不再响应新包 - 避免在主线程中阻塞接收导致界面假死,Android 或 GUI 应用建议用子线程或
ExecutorService - 异常如
IOException、UnknownHostException必须捕获,尤其是地址解析失败或端口被占用时










