我下面有两个应用程序。我用javaMulticastSocket
发送和接收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();
}
}
当我在本地主机上运行时,此代码工作正常。但是,当我尝试通过LAN在两台不同的计算机上运行它时,我无法收到数据包。
我已经关闭了两台计算机上的防火墙
谁能解释为什么?
编辑
我的路线表:
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
(假设连接两台机器的网络接口为eth0)
在Windows上,route print
在控制台(cmd.exe)提示符下键入(您可能需要管理员权限),然后检查以下几行:
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
(这是西班牙机器:“ Envínculo”的意思是“链接到”)
Windows列出了多播数据包的多个可能路由。发送方程序实际使用的路由是度量最低的路由(最后一个列号)。在我的设置中,这是使用192.168.10.100
(我的主网卡)上的网络接口的路由。
检查您的计算机是否将其网卡列为多播的最低度量标准接口。您可能将其127.0.0.1
作为多播(localhost)的主要接口,而不是物理网络接口。
另外,您可能需要使用多播组地址来测试可达性224.0.0.1
。这是所有主机的多播组。假定任何组播数据包都可以被同一子网内的任何主机接收。检查RFC 5771以获取有关多播地址分配的更多信息:http ://tools.ietf.org/html/rfc5771
请注意,如果两台计算机都位于同一子网中(例如,连接到同一台交换机),则多播效果更好。如果两者之间有路由器,则情况会更加复杂。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句