【发布时间】: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