gpt4 book ai didi

java - 谁能解释为什么我的 java 代码多播不能通过 LAN 工作?

转载 作者:行者123 更新时间:2023-11-29 03:11:36 26 4
gpt4 key购买 nike

我在下面有两个应用程序。我使用 java MulticastSocket 发送和接收 DatagramPacket

发件人

public class Sender {

public static void main(String[] args) throws IOException {
int port = 5000;
String group = "225.4.5.6";
final MulticastSocket s = new MulticastSocket();
byte[] buf = new byte[10];
for (int i = 0; i < buf.length; i++) {
buf[i] = (byte) i;
}
final DatagramPacket pack = new DatagramPacket(buf, buf.length,
InetAddress.getByName(group), port);
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {

@Override
public void run() {
try {
s.send(pack);
System.out.println("Sent");
} catch (IOException ex) {
Logger.getLogger(Sender.class.getName()).log(Level.SEVERE, null, ex);
}
}
}, 0, 1000);
//s.close();
}
}

接收者

public class Receiver {

/**
* @param args the command line arguments
*/
public static void main(String[] args) throws IOException {
int port = 5000;
String group = "225.4.5.6";
MulticastSocket s = new MulticastSocket(port);
s.joinGroup(InetAddress.getByName(group));
byte[] buf = new byte[1024];
DatagramPacket pack = new DatagramPacket(buf, buf.length);
while (true) {
s.receive(pack);
System.out.println("Received data from: " + pack.getAddress().toString()
+ ":" + pack.getPort() + " with length: "
+ pack.getLength());
System.out.write(pack.getData(), 0, pack.getLength());
System.out.println();
}
// s.leaveGroup(InetAddress.getByName(group));
// s.close();
}

}

当我在本地主机上运行这段代码时,它工作正常。但是当我尝试在局域网中的两台不同计算机上运行它时,我无法接收数据包。

我两台电脑的防火墙都关了

谁能解释为什么?

编辑

我的路由表:

Network Destination        Netmask          Gateway       Interface  Metric
0.0.0.0 0.0.0.0 192.168.0.1 192.168.0.103 25
127.0.0.0 255.0.0.0 On-link 127.0.0.1 306
127.0.0.1 255.255.255.255 On-link 127.0.0.1 306
127.255.255.255 255.255.255.255 On-link 127.0.0.1 306
192.168.0.0 255.255.255.0 On-link 192.168.0.103 281
192.168.0.103 255.255.255.255 On-link 192.168.0.103 281
192.168.0.255 255.255.255.255 On-link 192.168.0.103 281
192.168.164.0 255.255.255.0 On-link 192.168.164.1 276
192.168.164.1 255.255.255.255 On-link 192.168.164.1 276
192.168.164.255 255.255.255.255 On-link 192.168.164.1 276
224.0.0.0 240.0.0.0 On-link 127.0.0.1 306
224.0.0.0 240.0.0.0 On-link 192.168.164.1 276
224.0.0.0 240.0.0.0 On-link 192.168.0.103 281
255.255.255.255 255.255.255.255 On-link 127.0.0.1 306
255.255.255.255 255.255.255.255 On-link 192.168.164.1 276
255.255.255.255 255.255.255.255 On-link 192.168.0.103 281

最佳答案

您是否为多播地址添加了路由?在 Linux 上你必须这样做:

route add -net 224.0.0.0/4 eth0

(假设连接两台机器的网络接口(interface)都是eth0)

在 Windows 上,在控制台 (cmd.exe) 提示符下键入 route print(您可能需要管理员权限)并检查此类行:

    224.0.0.0        240.0.0.0      En vínculo         127.0.0.1    306
224.0.0.0 240.0.0.0 En vínculo 192.168.56.1 276
224.0.0.0 240.0.0.0 En vínculo 192.168.10.100 266
224.0.0.0 240.0.0.0 En vínculo 192.168.79.1 276
224.0.0.0 240.0.0.0 En vínculo 192.168.34.1 276

(这是一台西类牙语机器:“En vínculo”的意思是“链接到”)

Windows 为多播数据包列出了不止一条可能的路由。发送程序实际使用的路由是度量最低的路由(最后一列编号)。在我的设置中,它是使用 192.168.10.100(我的主网卡)网络接口(interface)的路由。

检查您的机器是否将其网卡列为多播的最低公制接口(interface)。您可能将 127.0.0.1 作为多播 (localhost) 的主要接口(interface),而不是您的物理网络接口(interface)。

此外,您可能希望使用多播组地址 224.0.0.1 来测试可达性。这是全主机多播组。假定任何多播数据包都能够被同一子网内的任何主机接收。查看 RFC 5771 以获取有关多播地址分配的更多信息:https://www.rfc-editor.org/rfc/rfc5771

请注意,如果两台机器都在同一个子网中(例如,连接到同一个交换机),多播效果会更好。如果中间有一个路由器,事情就会复杂得多。

关于java - 谁能解释为什么我的 java 代码多播不能通过 LAN 工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29056928/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com