我的udp广播行为有问题,
public static final int PORT = 34567;
public static void main(String[] args) throws IOException,
InterruptedException {
if (args.length > 0 && args[0].equals("server")) {
int port;
if (args.length >= 2) {
port = Integer.parseInt(args[1]);
} else {
port = PORT;
}
DatagramSocket sr = new DatagramSocket(port, InetAddress.getLocalHost());
while (true) {
byte[] buf = new byte[256];
DatagramPacket pct = new DatagramPacket(buf, buf.length);
sr.receive(pct);
String s = new String(buf);
System.out.println(s.replaceAll("\0", "") + " " + pct.getAddress().toString());
}
} else {
DatagramSocket ss = new DatagramSocket();
ss.setBroadcast(true);
byte[] b = new byte[100];
DatagramPacket p = new DatagramPacket(b, b.length);
p.setAddress(InetAddress.getByAddress(new byte[] { (byte) 255,
(byte) 255, (byte) 255, (byte) 255 }));
p.setPort(PORT);
int i = 0;
while (true) {
String s = new Integer(i++).toString();
System.out.println(s);
b = s.getBytes();
p.setData(b);
ss.send(p);
Thread.sleep(1000);
}
机器A上的当我同时运行服务器和客户端时,它会立即收到几个数据包,所以我有以下输出
0 /192.168.253.5
0 /192.168.253.5
1 /192.168.253.5
1 /192.168.253.5
2 /192.168.253.5
2 /192.168.253.5
在其他机器B上,当我这样做时,服务器根本没有收到任何数据包
当我在机器A上运行客户端并在机器B上运行服务器时,服务器接收数据包
当我在机器A上运行服务器并在机器B上运行客户端时,服务器不会收到任何数据包
我认为这取决于发送udp socket的本地地址,因为每台机器都连接到多个网络,本地地址是随机选择的(是真的吗?),它只向本地地址所属的网络发送广播我是对的吗?
如果是这样,我怎样才能将广播发送到所有连接的网络? 也为什么收到几个相同的数据包(第一种情况)
答案 0 :(得分:1)
UDP请求通常仅限于当前子网(除非您通过网关然后向往,这是不寻常的)。所以这是一个问题。
没有获得任何UDP请求的计算机也可能有一个阻止它的本地防火墙。
答案 1 :(得分:1)
DatagramSocket sr = new DatagramSocket类(港口, InetAddress.getLocalHost());
将第二个参数更改为null,或省略它。您不关心从哪个IP地址接收数据报。
p.setAddress(InetAddress.getByAddress(新 byte [] {(byte)255, (字节)255,(字节)255,(字节)255}));
广播到255.255.255.255已被弃用了大约20年。使用特定于子网的广播地址。更好的是,调查多播。