我们正在使用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是否会由于某些错误而变得无效并且必须重新创建,或者我们是否可以一次简单地创建套接字并完成它?如果它可能变得无效并且必须重新创建,我们如何检测到它?

最佳答案

使DatagramSocket无效的唯一事情是:


关闭它。在这种状态下使用它将导致SocketException: socket closed.
绑定失败。在此状态下使用它可能会导致发生默认的bind()到0.0.0.0:0的情况,这将产生系统分配的端口,这可能不是您想要的。
将其连接到无效地址,在这种情况下,发送可能会失败,接收将无济于事:您可以通过disconnect()从中恢复。

10-01 08:59