Java的DatagramSockets可以变得无效还是可以永久使用而没有问题?

时间:2013-07-01 07:50:05

标签: java sockets udp

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

1 个答案:

答案 0 :(得分:1)

使DatagramSocket无效的唯一内容是:

  1. 关闭它。在此状态下使用它将导致SocketException: socket closed.

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

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