0

尽管已设置我的数据报套接字并没有抛出 SocketTimeout,但我不确定如何解决这个问题。代码如下。问题是,如果它没有通过这个套接字连接接收到任何消息,它将在第一次运行时超时。但是,它成功接收了几次消息,以后调用 .receive 时它不会超时。

DatagramSocket serverSocket = new DatagramSocket(serverSyncPort);
serverSocket.setSoTimeout(200);

while(true)
{
        receiveData = new byte[1024];
        receivePacket = new DatagramPacket(receiveData,receiveData.length);
        try
        {
            serverSocket.receive(receivePacket);
        }
        catch(SocketTimeoutException e) {}
}
4

2 回答 2

0

来自javadocs

如果超时到期,则会引发 java.net.SocketTimeoutException,尽管 DatagramSocket 仍然有效。必须在进入阻塞操作之前启用该选项才能生效。 超时必须 > 0。超时为零被解释为无限超时。

检查超时是否正确启用,如上面引用中突出显示的那样。

此外,稍后检查 , 的值getSoTimeout()以验证它是什么。

于 2012-12-12T03:32:41.737 回答
0

对此 DatagramSocket 的 receive() 调用将仅阻塞 setsockettimeout 时间。如果超时到期,则会引发 java.net.SocketTimeoutException,尽管 DatagramSocket 仍然有效。这里 200 毫秒设置为超时,它应该可以工作。

您正在尝试哪个环境?这可能是 Windows 上的预期行为,因为 SocketException 在 solaris / Linux env 上运行良好。

于 2012-12-12T04:12:15.053 回答