在Java中使用UDP时遇到了一个奇怪的问题。 设置:我的Android设备正在初始化通信,它通过Wifi连接。我的计算机运行一个用Java编写的服务器(JRE:1.8)并通过以太网连接。
我正在从Android设备向我的计算机发送UDP数据包:
standalone.bat -bmanagement sbstjwsvm1509 -b sbstjwsvm1509 -c standalone-full-ha.xml
发送数据包时不会抛出异常。 在我的计算机上打开Wireshark后,我可以看到正在接收的UDP数据包:
在我的服务器应用程序中,我正在尝试接收此UDP数据包:
address = InetAddress.getByName("192.168.178.57");
packet = new DatagramPacket(data, data.length, address, 61010);
socket.send(packet);
但是,未收到:address = InetAddress.getByName("192.168.178.57");
socket = new DatagramSocket(61010, address);
byte[] receiveBuffer = new byte[4096];
System.out.println("listening on " + socket.getLocalAddress().getHostAddress() + ":" + socket.getLocalPort() + "...");
// => listening on 192.168.178.57:61010...
packet = new DatagramPacket(receiveBuffer, receiveBuffer.length);
socket.receive(packet);
System.out.println("UDP message received");
永远不会被打印。
[编辑]
防火墙应配置为允许数据包(UDP message received
)。 Java中没有安全管理器会丢弃数据包(ufw allow 61010/udp
为System.getSecurityManager()
)。但是如果我通过服务器应用程序而不是Android设备发送UDP数据包,则会收到它
的 [/编辑]
我很确定这段代码在几个月前就已经运行了,而且我之间并没有这么做。
我缺少什么,有什么想法吗?
答案 0 :(得分:0)
感谢@John Bollinger,我对防火墙设置进行了第二次和第三次检查。 实际上,防火墙导致了这个问题。
通过ufw allow <port>/udp
明确允许特定端口显然不足以绕过阻止外部UDP数据包的任何规则。
在resetting the iptables rules之后,Android应用程序现在可以再次与我的服务器应用程序通信。
感谢您的投入!