首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java MulticastSocket发送但不接收

Java MulticastSocket发送但不接收
EN

Stack Overflow用户
提问于 2014-03-21 03:41:48
回答 3查看 1K关注 0票数 1

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

代码语言:javascript
复制
@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()));
}

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

收听发送发送

在这一点上,它将只是等待接收一些东西。

EN

回答 3

Stack Overflow用户

发布于 2014-03-21 03:54:39

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

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

票数 0
EN

Stack Overflow用户

发布于 2014-03-21 04:01:20

您可能会遇到发送线程和主执行之间的争用条件。如果所有的发送都在主进程阻塞接收之前完成,那么您将永远等待。在开始发送ping之前,尝试在线程中设置一个小睡眠(大约100ms),看看是否开始看到什么。同时检查所有的防火墙设置,这在过去肯定会烧毁我的。

票数 0
EN

Stack Overflow用户

发布于 2014-03-21 04:29:22

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22543473

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档