【发布时间】: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地址和端口号作为包头的一部分)。
-
好吧,我在这里和那里都红了,它就像在引擎盖下那样工作,但是当我再次尝试使用该端口时为什么会出现异常?