UDP收发程序异常:接收器无法接收UDP数据包
UDP接收端无法收到数据包的排查方案
1. 验证端口配置与加载正确性
- 检查
fifa.properties文件中的PORT值是否与发送端使用的端口一致,建议在代码中添加日志确认加载后的端口:int port = Integer.parseInt(props.getProperty("PORT")); System.out.println("Loaded port: " + port); // 添加此行确认端口 - 避免使用1-1024的系统保留端口,若使用此类端口需以管理员权限运行程序。
2. 排查发送端实现问题
- 确认发送端是否指定了正确的目标IP和端口:本机测试时,目标IP建议用
127.0.0.1而非0.0.0.0或本机公网IP; - 可以用简化的发送端代码测试:
import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class UDPSender { public static void main(String[] args) throws Exception { int port = 你的端口号; // 替换为接收端实际端口 DatagramSocket clientSocket = new DatagramSocket(); InetAddress IPAddress = InetAddress.getByName("127.0.0.1"); byte[] sendData = "test".getBytes("UTF-8"); DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port); clientSocket.send(sendPacket); clientSocket.close(); } } - 也可以用系统工具测试:Windows在
cmd执行echo test | nc -u 127.0.0.1 端口号,Linux/macOS执行echo "test" | nc -u 127.0.0.1 端口号,验证接收端是否能收到数据。
3. 检查Socket绑定地址
- 当前代码创建
DatagramSocket时仅指定端口,默认绑定到0.0.0.0(所有网卡),但如果本机多网卡或监听地址与发送端目标IP不匹配,可能导致收不到数据。可以显式绑定到127.0.0.1测试:DatagramSocket serverSocket = new DatagramSocket(port, InetAddress.getByName("127.0.0.1")); - 确认程序打印的监听地址(
Listening on udp:...)与发送端目标IP一致,若打印的是本机公网IP,但发送端用127.0.0.1发送,可能因网卡绑定问题无法接收。
4. 完善异常排查信息
- 将catch块的
System.out.println(e);改为e.printStackTrace();,这样能看到完整的异常栈,排查初始化阶段的错误(如文件找不到、端口被占用、权限不足等); - 检查
fifa.properties文件路径是否正确,程序是否有读取权限:若文件加载失败,Integer.parseInt会抛出NumberFormatException,可能导致程序直接终止。
5. 检查端口占用情况
- 用命令确认端口是否被其他程序占用:
- Windows:
netstat -ano | findstr :端口号 - Linux/macOS:
lsof -i :端口号
- Windows:
- 若端口被占用,接收端无法绑定会抛出
BindException,通过完整异常栈可以发现该问题。
内容的提问来源于stack exchange,提问作者Jean McCourt
相关产品推荐
相关产品推荐

