我编写了一个能够通过多播地址发送/接收消息的java程序。 我的多播发送者代码:
public boolean multicastSender(DataTransferObject message) {
try {
InetAddress group = InetAddress.getByName(ip);
MulticastSocket s = new MulticastSocket(port);
s.joinGroup(group);
String msg = jsh.dtoToJsonString(message);
DatagramPacket data = new DatagramPacket(
msg.getBytes(), msg.length(), group, port);
s.send(data);
s.leaveGroup(group);
return true;
} catch (IOException e) {
System.out.println(e.toString());
e.printStackTrace();
return false;
}
}
我的多播接收器代码:
public DataTransferObject multicastReceiver() {
try {
InetAddress group = InetAddress.getByName(ip);
MulticastSocket s = new MulticastSocket(port);
s.joinGroup(group);
byte[] buffer = new byte[1000 * 1024];
DatagramPacket data = new DatagramPacket(buffer, buffer.length);
String jsonData;
DataTransferObject dto;
while (true) {
s.receive(data);
jsonData = new String(buffer, 0, data.getLength());
dto = jsh.dtoFromJson(jsonData);
if (dto == null) {
continue;
} else {
return dto;
}
}
} catch (IOException e) {
System.out.println(e.toString());
e.printStackTrace();
return null;
}
}
我的程序有4个并行线程,它们监听和接收来自四个不同多播地址(224.0.0。[1-> 4])和端口[66601-> 66604]的消息。在测试中,我同时运行两个程序来测试它们之间的通信。然而,我发现有时,程序A向多播地址发送消息,在正确的情况下,A也会收到它,B也是如此。但有时候,我看到A宣布它发送了消息但是之后,没有A或B再次收到它。我在我的本地计算机上运行测试(带有核心2 duo的Mac OS 10.9)。这个问题应该是因为我的电脑还是别的?
非常感谢你。
答案 0 :(得分:0)
UDP,我认为是您的多播实施的基础,但不保证交付。接收器或网络将在过载时丢弃数据包。您需要更高级别的协议来确保投放(Google可靠多播)。
答案 1 :(得分:0)
我在Windows环境中看到过这种情况。我知道这是因为网络层与JVM是分开的。
这意味着一个JVM可以读取并处理/丢弃此消息,但是其他JVM不会读取相同的消息,因为网络层已经将UDP消息传递给第一个消费者,无论有多少JVM订阅了到同一组。这可能是也可能不是操作系统中的错误 - 这是非常主观的。我个人认为操作系统应该跟踪注册人,以便复制交付,因为这是客户的意图 - 如果应用程序正在加入一个组来接收多播,则会有一点误导。操作系统应该考虑到这一点。
我通过经验证据得出了这个结论,而其他平台可能并非如此。