我们正在使用DatagramSocket通过UDP发送消息。目前我们使用以下代码。
private void doSend() throws IOException, SocketException {
try (DatagramSocket clientSocket = new DatagramSocket()) {
byte[] messageBytes = message.getBytes(Charset.forName("UTF-8"));
DatagramPacket sendPacket = new DatagramPacket(messageBytes, messageBytes.length, address,
port);
clientSocket.send(sendPacket);
}
}
如您所见,我们为每封邮件重新创建DatagramSocket
。出于性能原因,我们只考虑创建一次套接字而不是每条消息。代码存在于一个长期存在的对象中,因此这意味着套接字存活了好几天。
我的问题是DatagramSocket
是否可以通过某些错误变得无效并且必须重新创建,或者我们是否可以简单地创建套接字一次并完成它?如果它可能变得无效并且必须重新创建,我们如何检测到它?
答案 0 :(得分:1)
使DatagramSocket
无效的唯一内容是:
关闭它。在此状态下使用它将导致SocketException: socket closed.
绑定失败。在这种状态下使用它可能会导致默认的bind()发生,到0.0.0.0:0,这将产生一个系统分配的端口,这可能不是你想要的。
将其连接到无效的地址,在这种情况下,发送可能会失败,并且接收将无效:您可以通过disconnect()
从中恢复。