用于检查套接字连接活动的计时器



我们有一个套接字应用程序,while循环的片段如下。我们想检查的是,如果它通过了30秒,没有更多的数据,那么关闭套接字连接。在事件中,如果一些数据在,那么我们重置计时器。我必须使用计时器或系统毫秒吗

while ((readChar=readSocket.read()) != -1) 
{
  //processing.
}

您可以配置套接字,以便在指定的时间间隔内没有接收到数据时,读取操作超时。

从套接字Javadoc:

public void setSoTimeout(int timeout) throws SocketException

使用指定的超时(以毫秒为单位)启用/禁用SO_TIMEOUT。将此选项设置为非零超时时,对与此套接字关联的InputStream的read()调用将仅阻塞此时间量。如果超时到期,则会引发java.net.SocketTimeoutException,尽管套接字仍然有效。必须在进入阻止操作之前启用该选项才能生效。超时值必须大于0。超时为零被解释为无限超时。

Parameters:
    timeout - the specified timeout, in milliseconds. 
Throws:
    SocketException - if there is an error in the underlying protocol, such as a TCP error.
Since:
    JDK 1.1
See Also:
    getSoTimeout()

使用这种方法,您可以读取数据,使用它(根据需要),然后再次从套接字中读取。如果得到超时异常,则关闭套接字。

socket.setSoTimeout(30 * 1000);                  // timeout after 30 seconds
try
{
  while ((readChar=readSocket.read()) != -1)     // block reading data ...
  {
    // processing ...
  }
}
catch (SocketTimeoutException e)                 // we didn't get any data within 30 seconds ...
{
  socket.close();                                // ... close the socket
}

使用异步NIO操作。如果您使用java6,异步操作是很棘手的,但是有许多网络库(Mina、Netty),尽管它们相当重。如果使用java7,就会实现真正的异步网络操作,并且操作简单(nio2)。更容易的是使用来自https://github.com/rfqu/df4j.

最新更新