簡介分組
有上創建組播發布者和接收器的數量的教程。
我用了一個發現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'。 –
另外,您需要指定傳出多播接口。在所有接口上使用相同的多播組,並指定用於多播的接口。 –