【问题标题】:DatagramSocket not throwing SocketTimeout - JavaDatagramSocket 不抛出 SocketTimeout - Java
【发布时间】:2012-12-12 03:24:00
【问题描述】:

尽管设置了 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) {}
}

【问题讨论】:

  • 有了那个异常处理,你怎么可能知道?
  • 这只是代码的一部分。我让它在 catch 块中输出到控制台
  • 我知道这真的很老了,但你有想过吗?

标签: java sockets datagram


【解决方案1】:

来自javadocs

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

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

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

【讨论】:

  • 我在每次接收前后都检查过它仍然是200,但是当它通过循环并且没有收到任何东西时不会超时......
【解决方案2】:

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

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

【讨论】:

  • setSoTimeout() 适用于我所知道的所有 Java 平台。否则它不会在那里。
猜你喜欢
  • 2016-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多