java udp广播问题

时间:2011-04-07 22:55:39

标签: java networking udp

我的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的本地地址,因为每台机器都连接到多个网络,本地地址是随机选择的(是真的吗?),它只向本地地址所属的网络发送广播我是对的吗?

如果是这样,我怎样才能将广播发送到所有连接的网络? 也为什么收到几个相同的数据包(第一种情况)

2 个答案:

答案 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年。使用特定于子网的广播地址。更好的是,调查多播。