0

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

4

1 回答 1

1

唯一使 a 无效的DatagramSocket是:

  1. 关闭它。在这种状态下使用它会导致SocketException: socket closed.

  2. 绑定失败。在这种状态下使用它可能会导致默认的 bind() 发生,到 0.0.0.0:0,这将产生一个系统分配的端口,这可能不是你想要的。

  3. 将其连接到无效地址,在这种情况下,发送可能会失败并且接收将无济于事:您可以通过disconnect().

于 2013-07-01T08:13:28.200 回答