【问题标题】:Java MulticastSocket sending but not receiving [duplicate]Java MulticastSocket发送但不接收[重复]
【发布时间】:2014-04-27 22:02:00
【问题描述】:

我编写了一些代码,假设从 MulticastSocket 接收数据。由于某种原因,套接字永远不会收到。我已将其分解为下面的代码。我发送了几个数据包,但从未收到这些数据包。我可以确认数据包已发送,因为 wireshark 检测到它们。此外,我已经从不同的机器(相同的网络)发送了数据包,但仍然没有收到数据包。我已确认防火墙已关闭,有什么想法吗?

@Test
public void test_testrun() {
    InetAddress addr;
    try {
        addr = InetAddress.getByName("234.67.67.67");
    } catch (UnknownHostException e) {
        throw new RuntimeException(e);
    }

    int port = 5555;
    byte[] data = "1234567890".getBytes();
    final DatagramPacket sendPacket = new DatagramPacket(
            data,
            data.length,
            addr,
            port
    );

    // initialize the server.
    MulticastSocket s;
    try {
        s = new MulticastSocket(port);
        s.joinGroup(addr);
        s.setLoopbackMode(true);
    } catch (IOException e) {
        throw new RuntimeException(e);
    }

    // send every 100 ms.
    new Thread(new Runnable() {
        @Override
        public void run() {
            for (int i = 0 ; i < 5; ++i) {
                try {
                    System.out.println("Sending");
                    new MulticastSocket().send(sendPacket);
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }

                try {
                    Thread.sleep(100);
                } catch (InterruptedException e1) {
                    e1.printStackTrace();
                }
            }
        }
    }).start();

    // receive the packet.
    DatagramPacket packet = new DatagramPacket(new byte[data.length], data.length);
    try {
        System.out.println("Listening");
        s.receive(packet);
    } catch (IOException e) {
        s.close();
        throw new RuntimeException(e);
    }

    s.close();

    Assert.assertTrue(Arrays.equals(data, packet.getData()));
    System.out.println("DATA: "+ new String(packet.getData()));
}

更新: 我忘了包括输出..

聆听 发送 发送 发送 发送 发送中

此时,它只会等待接收东西。

【问题讨论】:

标签: java


【解决方案1】:

一个简单的事情可能是如果你在路由器后面。您的路由器可能正在接收传入的请求,但不知道将其发送到哪里。这需要您将端口 5555 转发到正确的内部 IP,即运行您的服务器程序的机器。

您可以对此进行检查的一种方法是使用 IP 127.0.0.1localhost 在本地运行客户端和服务器。

【讨论】:

  • MulticastSocket 不支持 127.0.0.1,因为它不是多播地址。我已经在 3 个独立的网络上对此进行了测试,我确认这些网络过去有效。
  • 好的,但是您认为问题可能是端口转发问题吗?如果您根本没有收到数据包,那很有可能。
  • 所以我为每个定义的网络接口显式调用了 MulticastSocket.joinGroup。这行得通!
【解决方案2】:

您可能遇到了发送线程和主执行之间的竞争条件。如果所有发送在主进程阻塞接收之前完成,您将永远等待。在开始发送 ping 之前(大约 100 毫秒)尝试在线程中放置一个小睡眠,看看你是否开始看到任何东西。还要检查任何防火墙设置,这在过去肯定让我很伤心。

【讨论】:

  • 我忘记添加我提供的示例的输出。它很好地表明了竞争条件。第 n 次检查我的防火墙。仍然关闭。
【解决方案3】:

另一种可能性(请原谅我的不确定性)是套接字对象的共享内存使用情况。有什么阻止您拥有单独的套接字对象,一个用于发送,一个用于接收?

【讨论】:

  • 没有原因,但是使用相同的原因也无济于事。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-21
  • 1970-01-01
  • 2017-01-06
  • 1970-01-01
  • 1970-01-01
  • 2012-01-26
  • 2021-07-30
相关资源
最近更新 更多