在Java&;中从双NIC接收UDP;Ubuntu
我在192.168.1.1广播到192.168.1.255:1234和192.168.2.1广播到192.168.2.255:1235上有2UDPbroadcast服务器。 我有一个必须接收所有数据包的客户端。 下面是java中的一个简单代码:在Java&;中从双NIC接收UDP;Ubuntu,java,ubuntu,networking,udp,broadcast,Java,Ubuntu,Networking,Udp,Broadcast,我在192.168.1.1广播到192.168.1.255:1234和192.168.2.1广播到192.168.2.255:1235上有2UDPbroadcast服务器。 我有一个必须接收所有数据包的客户端。 下面是java中的一个简单代码: final DatagramSocket socket1, socket2; socket1 = new DatagramSocket(1234); socket2 = new DatagramSocket(1235); fina
final DatagramSocket socket1, socket2;
socket1 = new DatagramSocket(1234);
socket2 = new DatagramSocket(1235);
final DatagramPacket p = new DatagramPacket(new byte[10], 10);
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
socket1.receive(p);
System.out.println(p.getAddress());
} catch (IOException e) {
e.printStackTrace();
}
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
socket2.receive(p);
System.out.println();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}).start();
}
问题是java应用程序无法从Ubuntu中的两个NIC接收数据。它总是从192.168.2.255(eth1)接收数据。所有数据包都可以使用wireshark转储,但java无法接收它们。另外,当我在TinyCore发行版中使用完全相同的java代码时,从两个NIC接收数据包也没有问题。
Ubuntu中的Java有什么问题?如果要绑定到特定地址,需要指定它:
socket1 = new DatagramSocket(1234, InetAddress.getByName("192.168.1.255"));
socket2 = new DatagramSocket(1235, InetAddress.getByName("192.168.2.255"));
另外,您不应该在两个线程中使用相同的DatagramPacket实例,因为它们肯定会共享缓冲区,并且在并发数据包的情况下,结果是不可预测的