【问题标题】:JAVA UDP Receive not working in different NetworkJAVA UDP 接收在不同的网络中不起作用
【发布时间】:2014-12-09 14:47:49
【问题描述】:

我制作了一个小工具来接收/发送某些 UDP 数据包。 它在我的家庭网络中正常工作,无论数据包来自这台 PC、我的 Android 手机还是网络中的另一台 PC。 但是如果我尝试在它应该使用的网络中使用它,接收部分就会停止工作。

防火墙不是问题,因为我在 Wireshark 中看到收到的 UDP 数据包。 以下是问题的代码部分(如果是由代码引起的):

        static byte[] buffer = new byte[16];
        ..... //more code + sending part of the program 
        while (true){
            DatagramPacket receivePacket = new DatagramPacket(buffer, buffer.length);
            //"buffer" 
            serverSocket.receive(receivePacket);
            System.out.println("Packet received!");

            // Convert the contents to a string, and display them
            String msg = new String(buffer, 0, receivePacket.getLength());
            System.out.println(receivePacket.getAddress().getHostName() + ": "
                + msg);

            // Reset the length of the packet before reusing it.
           receivePacket.setLength(buffer.length);

           //irrelevant stuff....
             ....


        }

如果我在我的家庭网络中运行程序并从任何地方向我的电脑发送一个数据包,我会得到这个输出:

"192.168.0.XXX: ContentsOfThePacket" 我可以使用 msg 字符串。 但是在另一个网络中,当到达serverSocket.receive(receivePacket); 时没有任何反应,即使 PC 正在接收与家庭网络上相同的数据包(通过wireshark 确认),所以它似乎不是由防火墙引起的设置在那里。 此外,整个“将数据包发送到网络中的某台电脑”部分工作完美......

编辑:我现在也在我的笔记本电脑上运行了这个程序,无论是谁发送数据包(其他电脑、手机),也无论我使用哪个接口连接到网络(usb-以太网适配器),它都可以正常工作或 wlan)(再次在家庭网络中),但是对于笔记本电脑,它也不适用于其他网络

【问题讨论】:

  • 您所说的另一个网络是什么?是不是和你已经在用的一样?如果它的窗口尝试在防火墙规则中为您正在使用的端口添加例外,请查看。
  • 另一个网络是这样的:服务器 - 单墙 - 交换机 - pc/笔记本单墙/服务器不是问题,因为我可以看到我应该在wireshark中从服务器接收的数据包。我还为所有东西禁用了 Windows 防火墙并关闭了我的 Bitdefender...
  • 有人能告诉我:如果windows防火墙“阻止”了数据包,它不应该永远不会出现在wireshark中吗?还是更像cable > interface > wireshark > windows防火墙,所以即使windows防火墙阻止了我也可以看到wireshark中的数据包?
  • 我不确定,但我认为wireshark 可能会通过您的防火墙阻止捕获数据包。您需要了解防火墙在哪里工作(OSI 堆栈的哪一层),但wireshark 可以捕获大多数层。您可以使用 iperf 对其进行测试。它是一个流量生成器。所以在 xxxx 端口运行 iperf 并接收来自服务器的流量。在防火墙中故意阻止该端口。看看 wireshark 是否可以捕获该流量。如果是这样,您可以排除这种可能性。

标签: java networking udp udpclient


【解决方案1】:

没有机会为您提供解决方案(可能是猜测),但我建议通过使用 netcat 测试此场景来隔离问题(如果您使用的是 unix 或有 cygwin 可用)。 Netcat 有一个 UDP 模式(-u 开关)。如果您可以使用 netcat 传输数据,那么它就是您的程序。如果失败,则无需进一步调试。

在接收方:

nc -u -p <port>

发送方:

echo "Hello" | nc -u <host> <port>

【讨论】:

  • 我可以毫无问题地在 PC 上接收/发送数据包,我发送它们的设备也会相应地运行,wiresharks 说我正在发送/接收程序运行所需的一切,甚至在另一个网络中。但不知何故,我的程序就像没有传入的 UDP 数据包一样(它应该输出任何接收到的 UDP 数据包)......
猜你喜欢
  • 2018-05-03
  • 1970-01-01
  • 2020-07-30
  • 2012-09-29
  • 2015-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多