Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 任何本地主机客户端上的MulticastSocket未接收到多播数据包_Java_Sockets_Networking_Udp_Multicast - Fatal编程技术网

Java 任何本地主机客户端上的MulticastSocket未接收到多播数据包

Java 任何本地主机客户端上的MulticastSocket未接收到多播数据包,java,sockets,networking,udp,multicast,Java,Sockets,Networking,Udp,Multicast,简介 有许多关于创建多播发布者和接收者的教程 我用了一个经过一些修改的 其他一些: 请注意,这些教程都非常相似 详细信息: 服务器在端口7777上运行,并将数据报发送到224.0.0(我测试了多播范围内的几个其他ip:224.0.0.0到239.255.255,但这些都不起作用) 然后,客户端加入多播组224.0.0.0,并等待数据包响应(作为线程运行) 额外:我发送一条类似于:123.23.13.12[主机名]:1234的消息作为数据报数据 问题: 来自服务器(本地主机上)的多播数据

简介

有许多关于创建多播发布者和接收者的教程

我用了一个经过一些修改的

其他一些:

请注意,这些教程都非常相似

详细信息:

服务器在端口
7777
上运行,并将数据报发送到
224.0.0
(我测试了多播范围内的几个其他ip:
224.0.0.0
239.255.255
,但这些都不起作用)

然后,客户端加入多播组
224.0.0.0
,并等待数据包响应(作为线程运行)

额外:我发送一条类似于:
123.23.13.12[主机名]:1234
的消息作为数据报数据

问题:

来自服务器(本地主机上)的多播数据包未到达客户端(本地主机上)

客户端包括一个java控制台应用程序(代码如下)和Android Emulator上的Android应用程序。两个客户端都不接收多播数据包

我知道正在发送多播数据包,如中所示

下面你会发现一个基本的例子,我有

TL;DR:服务器发送多播数据包(通过Wireshark确认),但客户端未收到这些数据包

欢迎提出建议

更新

根据另一个Java程序员的评论,我检查了我的防火墙。瞧,我的防火墙掉在
输入链
转发链上。我将其设置为接受所有传入的(临时)

基于Ron Maupin的评论

  • 我已更改发送的消息以排除主机名,因此发送的消息为
    123.12.13.23:1234
  • 我已将多播发送地址更改为
    239.254.0.0
    ,该地址在指定范围内(请参见Ron的评论)
  • 多播端口设置为
    7777
  • broadcastServer()
    try catch
    块中,使用
    s.setInterface(InetAddress.getLocalHost())
    设置传出接口
应用这些更改后,客户端仍不会接收任何数据包

代码:

服务器端(控制台应用程序):

客户端(控制台应用程序):


解决方案最终只是一个微不足道的改变

解决此问题非常简单,只需更改:

s = new MulticastSocket(multicastPort);

仅在服务器端

注意:防火墙是必需的,请检查是否允许多播数据包通过。我使用的接口是localhost,但不是必需的。但是,这可以通过获取所需的指定接口来设置

更新

EJP的评论:


我将端口更改为
8888
。此端口用于发送服务器数据报,并用于客户端连接其
多播套接字

绑定套接字后调用的
setReuseAddress()
。它没有效果。您需要创建一个未绑定的
MulticastSocket
,调用
setReuseAddress()
,然后将其绑定。

是否检查了客户端上没有活动的软件防火墙?首先,
224.0.0
是一个无法使用的保留多播地址。您可能希望在允许的范围内使用多播地址,这将是组织本地范围内的
239.0.0.0
239.255.255.255
。接下来,“我发送一条类似于:
123.23.13.12[主机名]:1234
的消息作为数据报数据”是不正确的。这将是一个DNS名称,这在多播中是不允许的。您必须发送如下消息:
123.23.13.12:1234
。此外,您还需要指定传出多播接口。所有接口上都使用相同的多播组,您可以指定用于多播的接口。@JustanotherJavaprogrammer请参阅update@RonMaupin感谢您的评论和反馈,请参阅updateSo客户端是如何成功地将多播发送到端口7777的?不可信。感谢您的回答,请发表评论,因为您的回答可能会有所帮助,但并不能解决问题/问题,这是投否决票的原因。
String multicastAddress = "239.254.0.0", multicastPort = 7777;

private void startServerListenerThread() {
    Thread thdServerListener = new Thread(new Runnable() {
        @Override
        public void run() {
            MulticastSocket socket = null;
            InetAddress group = null;
            try {
                socket = new MulticastSocket(multicastPort);
                socket.setReuseAddress(true);
                group = InetAddress.getByName(multicastAddress);
                socket.joinGroup(group);

                handleServerBroadcasts(socket);
                socket.leaveGroup(group);
                socket.close();

            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        private void handleServerBroadcasts(final MulticastSocket socket) {
            while (true){
                try {
                    byte[] buf = new byte[256];
                    DatagramPacket packet = new DatagramPacket(buf, buf.length);
                    socket.receive(packet);
                    String received = new String(packet.getData());

                    String address = received.substring(0, received.indexOf(":"));
                    String port = received.substring(received.indexOf(":") + 1);

                    System.out.println();
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (Exception x){
                    x.printStackTrace();
                }
            }
        }
    });
    thdServerListener.start();
}
s = new MulticastSocket(multicastPort);
s = new MulticastSocket();