我不知道';使用Java无法从DatagramPacket获取响应

我不知道';使用Java无法从DatagramPacket获取响应,java,sockets,packet,datagram,Java,Sockets,Packet,Datagram,我想检查远程主机服务器是否接受特定端口上的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.setSoTime

我想检查远程主机服务器是否接受特定端口上的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
(在
localhost
上,您可以轻松调试软件,了解接收到的内容)


此外,您应该希望在端口上绑定您的
DatagramSocket
,以便接收数据包。在发送时,您不需要连接
DatagramSocket

您绝对应该尝试
localhost
(在
localhost
上,您可以轻松地调试软件,了解接收到的内容)


此外,您应该希望在端口上绑定您的
DatagramSocket
,以便接收数据包。发送时不需要连接
DatagramSocket

需要将以下变量传递给JRE

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

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

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

使用
localhost
(127.0.0.1)测试它,这是您自己的计算机。您可以使用来检查网络活动。UDP是TCP/IP协议栈的一部分。您在服务器上遇到了什么错误。我认为UDP套接字不需要使用connect()。。为什么不能使用just send(packet)…如果您的场景是NAT,则远程服务器位于路由器/NAT后面(使用专用IP-10.*/172.xx.*/192.168.*),并且您没有将端口转发到UDP端口。。。。无法工作。调用isConnected()并忽略结果是毫无意义的。无论如何,这是毫无意义的。如果未连接,connect()会引发异常。请使用您自己的计算机
localhost
(127.0.0.1)进行测试。您可以使用来检查网络活动。UDP是TCP/IP协议栈的一部分。您在服务器上遇到了什么错误。我认为UDP套接字不需要使用connect()。。为什么不能使用just send(packet)…如果您的场景是NAT,则远程服务器位于路由器/NAT后面(使用专用IP-10.*/172.xx.*/192.168.*),并且您没有将端口转发到UDP端口。。。。无法工作。调用isConnected()并忽略结果是毫无意义的。无论如何,这是毫无意义的。如果未连接,connect()将引发异常。+1并且必须将路由器配置为允许UDP数据包。仅TCP是不够的。+1和路由器必须配置为允许UDP数据包。光靠TCP是不够的,为什么?我看不到任何证据表明这是问题所在。为什么?我看不到任何证据表明这是问题所在。