【问题标题】:I don't get response from DatagramPacket with Java我没有收到来自 Java 的 DatagramPacket 的响应
【发布时间】:2013-01-03 19:18:10
【问题描述】:

我想检查一个远程主机服务器是否接受特定端口上的 UDP 数据包。使用 SocketServer,我可以建立 TCP/IP 连接并且它可以工作,但我必须使用 UDP。

DatagramSocket ds;
DatagramPacket dp;
byte[] bytes = new byte[32];
InetAddress IAddress = new InetAddress.getByName("86.55.X.X");    

ds = new DatagramSocket();
ds.setSoTimeout(100);
ds.connect(IAddress, 1122);
ds.send(dp);
ds.isConnected();
dp = new DatagramPacket(bytes, bytes.length);
ds.receive(dp);
ds.close();

上面的代码应该可以工作,我不知道如何测试它,因为我没有找到任何可以运行/测试上面代码的主机/软件。我正在尝试在远程主机上对其进行测试。远程主机禁用了 Windows 操作系统和防火墙。它有一个路由器,防火墙也被禁用。我可以访问远程服务器并在路由器中进行更改。我的问题是:如果唯一打开的端口用于 TCP/IP,远程主机可以接受 UDP 数据包吗? (端口转发)。 在路由器控制面板中,我只能为 TCP/IP 进行端口转发。

【问题讨论】:

  • 使用您自己的计算机localhost (127.0.0.1) 进行测试。您可以使用Wireshark 来检查网络活动。 UDP 是 TCP/IP 协议栈的一部分。
  • 您在服务器上遇到什么错误。我认为您不需要将 connect() 用于 UDP 套接字..为什么不能只使用 send(packet)..
  • 如果您的场景使用 NAT,则远程服务器位于 router/nat 后面(使用私有 IP -10.*/172.xx.*/192.168.*)并且您没有端口-转发 UDP 端口.... 无法正常工作。
  • 调用 isConnected() 并忽略结果是没有意义的。总之是没有意义的。如果你没有连接,connect() 会抛出异常。

标签: java sockets packet datagram


【解决方案1】:

您绝对应该尝试localhost(在localhost 上,您可以轻松地调试您的软件,了解收到东西时发生的情况)。

此外,您应该希望将您的DatagramSocket 绑定到一个端口以接收数据包。发送时无需连接DatagramSocket

【讨论】:

  • +1 并且必须将路由器配置为允许 UDP 数据包。仅 TCP 是不够的。
【解决方案2】:

您需要将以下变量传递给您的 JRE

java -Djava.net.preferIPv4Stack=true  ...

【讨论】:

  • 为什么?我没有看到任何证据表明这是问题所在。
猜你喜欢
  • 2013-01-05
  • 2021-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-05
  • 1970-01-01
  • 2015-10-12
  • 1970-01-01
相关资源
最近更新 更多