java udp广播问题

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

如果是这样,我如何向电脑连接的所有网络发送广播? 还有为什么收到多个相同的数据包(第一种情况)

最佳答案

DatagramSocket sr = new DatagramSocket(port, InetAddress.getLocalHost());

将第二个参数更改为 null,或忽略它。您并不关心从哪个 IP 地址接收数据报。

p.setAddress(InetAddress.getByAddress(new byte[] { (byte) 255, (byte) 255, (byte) 255, (byte) 255 }));

广播到 255.255.255.255 已被弃用约 20 年。使用子网特定的广播地址。更好的是,研究一下多播。

关于java udp广播问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5588585/

相关文章:

windows - 为什么有些网络 API 能够接受远程连接,而有些则不能?

c - 这里的 sendto() 参数有什么问题?

java - 如何重新部署在tomcat上运行的一类webapp?

java - 在字符串数组中分配特殊字符

java - 动态生成和播放声音(来自频率/幅度数据)

c - 带有 gcc 编译器的 UDP recvfrom 警告

file - 通过互联网发送文件的可靠方式

java - 选定的变量在乒乓球游戏中不会改变 - Swing

c# - 如何对自定义套接字 TCP 协议(protocol)使用证书身份验证?

windows - 如何避免 GetFileAttributes 中的网络停顿?