简介分组
有上创建组播发布者和接收器的数量的教程。
我用了一个发现here进行了一些修改。
几个人:
注意,这些教程都是颇为相似。
详情:
服务器端口7777
运行并发送数据报224.0.0.0
(我测试了几个其他知识产权的的组播范围:224.0.0.0
到239.255.255.255
,但这些并没有工作)
然后客户端加入组播组224.0.0.0
并等待响应数据包(如运行一个线程)
额外:我送如:123.23.13.12[host-name]:1234
作为数据报数据。
问题:
从服务器(在本地主机)多播数据包未到达客户端(在本地主机)。
客户端在Android模拟器上包含一个Java控制台应用程序(代码见下)和Android应用程序。这两个客户端都不会收到组播数据包
我知道,组播数据包被发送,因为这是在Wireshark
所示下面你会发现这里面我有一个基本的例子。
TL; DR:服务器发送组播数据包(通过Wireshark确认),但客户端不接收它们。
建议非常欢迎!
UPDATE
基于Just another Java programmer
的评论,我检查我的防火墙。你瞧,我的防火墙正在下降input
和forward
链。我将此设置为accept
所有传入(暂时)
根据Ron Maupin
的评论。
- 我已经改变发送到排除的主机名,从而发送的消息是
123.12.13.23:1234
- 我已经改变了的多播发送地址
239.254.0.0
其在指定的范围内的消息(见Ron的评论) - 的多播端口被设置为
7777
- 出接口在
broadcastServer()
try catch
块设定s.setInterface(InetAddress.getLocalHost())
应用这些更改后,客户端仍然没有收到任何数据包。
代码:
服务器端(控制台应用程序):
String multicastAddress = "239.254.0.0", multicastPort = 7777;
private void broadcastServer() {
String message = null;
MulticastSocket s = null;
InetAddress local = null, group = null;
InetAddress[] allByName;
try {
local = InetAddress.getLocalHost();
s = new MulticastSocket(multicastPort);
s.setReuseAddress(true);
s.setInterface(local)
s.joinGroup(InetAddress.getByName(multicastAddress));
group = InetAddress.getByName(multicastAddress);
} catch (SocketException e) {
e.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
MulticastSocket socket = s;
// getNetworkIP() gets lan network ip
// serverport = 1025
message = local.getHostAddress() + ":" + String.valueOf(serverPort);
byte[] buf = message.getBytes();
DatagramPacket packet = new DatagramPacket(buf, buf.length, group, multicastPort);
thdBroadcaster = new Thread(() -> {
while (bRunServer) {
try {
Thread.sleep(1000);
printf("[Broadcast] Broadcasting...");
socket.send(packet);
printf("OK\n");
printf("");
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
socket.close();
});
thdBroadcaster.start();
}
客户端(控制台应用程序):
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();
}
您是否检查过客户端没有活动的软件防火墙? –
首先,'224.0.0.0'是一个保留的多播地址,不能使用。您可能希望在允许的范围内使用多播地址,并且这将是组织本地范围的“239.0.0.0”到“239.255.255.255”。接下来,“_I发送如下消息:”123.23.13.12 [host-name]:1234'作为数据报data_,“是不正确的。这将是一个DNS名称,不允许在多播中使用。您必须发送如下消息:'123.23.13.12:1234'。 –
另外,您需要指定传出多播接口。在所有接口上使用相同的多播组,并指定用于多播的接口。 –