Java UDP 客户端不接收数据包

Posted

技术标签:

【中文标题】Java UDP 客户端不接收数据包【英文标题】:Java UDP Client Not Receiving Packets 【发布时间】:2015-10-13 05:32:49 【问题描述】:

我制作了一个使用 UDP 的 java 应用程序,但在我的计算机上托管时似乎无法接收 LAN 外部的数据包。我尝试将我的应用程序放在托管服务器上,它似乎可以工作(接收数据包)。

是什么导致这种情况发生?我希望它也能在我的电脑上运行。

客户:

try 
    this.socket = new DatagramSocket(2500);
 catch (SocketException e1) 
    System.out.println("Could not establish connection");
    return;

while(true)
    byte[] data = new byte[1024];
    DatagramPacket packet = new DatagramPacket(data, data.length);

    try
        socket.receive(packet);
    catch(IOException e)
        System.out.println("Connection close");
        break;
    
    System.out.println("RECEIVED " + new String(packet.getData()));

服务器:

try 
    this.socket = new DatagramSocket(25860);
 catch (SocketException e) 
    e.printStackTrace();


try 
    byte[] data = datas.getBytes();
    DatagramPacket packet = new DatagramPacket(data, data.length, ipAddress, 2500);

    socket.send(packet);
catch(IOException e) 



System.out.println("Sent " + ipAddress.getHostAddress() + ":" + port + " " + new String(datas));

IP 地址是正确的,它打印出的 IP 与我的客户端完全相同。但是我仍然没有收到。

【问题讨论】:

当您无法创建DatagramSocket, 时不要打印“无法建立连接”,或者当您收到IOException 接收UDP 数据报时“连接关闭”。打印异常。首先没有要建立或关闭的连接,其次,您正在抑制重要的调试信息。并且永远忽略 IOException,就像在 send() 之后一样。修复该问题并根据实际情况调整您的问题。new String(packet.getData())) 应该是 new String(packet.getData(), packet.getOffset(), packet.getLength())) 【参考方案1】:

如果它在一台计算机(单台)上运行,而在另一台计算机上运行不正常,请尝试检查防火墙,您的计算机应该允许 UDP 连接。

【讨论】:

错误,没有。看看Javadoc。构造DatagramSocket 不会连接到任何东西,它绑定 到本地IP 地址和端口。这将抛出一个BindException. 您是对的,但是我很快阅读了帖子,服务器和客户端在原始问题帖子中具有误导性。人们会期望客户端连接到服务器。然而,它可能是更广泛的通信序列的一部分。感谢您的评论,我更改了答案以避免出现误导性答案。 我同意,客户端和服务器似乎在问题中回到了前面。

以上是关于Java UDP 客户端不接收数据包的主要内容,如果未能解决你的问题,请参考以下文章

游戏服务器应该如何接收具有定义滴答率的 udp 数据包?

从 mio::udp::UdpSocket.recv 接收部分 UDP 数据包

在一个应用程序中发送和接收 UDP 数据包

Java将udp数据包发送到dns服务器

当我们从 UDP 服务器接收数据包时,为啥我们必须在单独的线程中接收它们?

java-接收UDP包时设置超时函数java