【问题标题】:Java multiple UDP clients listening same portJava 多个 UDP 客户端监听同一个端口
【发布时间】:2020-09-07 15:54:15
【问题描述】:

假设我启动了一个简单的 UDP 服务器:nc -u localhost 10000

还有一个简单的 UDP 客户端:nc -ul 10000

那么,在 Java 中,是否有可能接收服务器发送的消息而不会因为已经有客户端而收到“地址已在使用”异常?

编辑:这是我正在使用的代码:

DatagramSocket socket = new DatagramSocket(port);

new Thread(() -> {

    try {

        while(true) {

            byte[] receiveData = new byte[256];
            DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
            socket.receive(receivePacket);

            String message = new String( receivePacket.getData(), 0, receivePacket.getLength()).trim();
        }
    }
    catch (SocketException ignore) {}
    catch (IOException e) { e.printStackTrace(); }

}).start();

这会导致 java.net.BindException: Address already in use (bind failed)。

使用这个:

DatagramSocket socket = new DatagramSocket(null);
socket.setOption(SO_REUSEPORT, true);
socket.setOption(SO_REUSEADDR, true);

new Thread(() -> {

    try {

        while(true) {

            byte[] receiveData = new byte[256];
            DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
            socket.receive(receivePacket);

            String message = new String( receivePacket.getData(), 0, receivePacket.getLength()).trim();
        }
    }
    catch (SocketException ignore) {}
    catch (IOException e) { e.printStackTrace(); }

}).start();

不产生异常但我不会收到服务器发送的消息。

编辑 2:在实际情况下,服务器正在广播消息。

【问题讨论】:

  • client 不是在给定端口连接到 server 吗?监听该端口的是服务器。客户端将为自己自动分配一个不同的端口(> 4096),然后连接到服务器,告诉它在哪里发送响应(因为包总是包含发送者和接收者的IP地址和端口号作为包头的一部分)。
  • 好吧,我在这里和那里都红了,它就像在引擎盖下那样工作,但是当我再次尝试使用该端口时为什么会出现异常?

标签: java sockets udpclient


【解决方案1】:

这应该可以通过使用StandardSocketOptions.SO_REUSEPORT:

对于面向数据报的套接字,套接字选项通常允许将多个 UDP 套接字绑定到相同的地址和端口。

Linux 内核从 3.9 开始支持此功能。

在 Windows 上,您可能需要使用 SO_REUSEADDR,但我不确定。

使用 SO_REUSEADDR
SO_REUSEADDR 套接字选项允许一个套接字强制绑定到另一个套接字正在使用的端口。

【讨论】:

  • 谢谢。我尝试过(查看我的编辑)但它不起作用:我不再收到异常,但我也没有收到服务器发送的消息。
猜你喜欢
  • 2017-12-08
  • 2013-11-05
  • 1970-01-01
  • 2011-05-20
  • 2013-06-17
  • 2014-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多