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();