定时器检查套接字连接的活动?

时间:2012-04-03 01:49:29

标签: java timer

我们有一个套接字应用程序,其中while循环的片段如下所示。我们想要检查的是,如果它通过30秒并且没有更多数据然后关闭套接字连接。如果某些数据存在于事件中,则我们重置计时器。我必须使用计时器或系统毫秒

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

  //processing.
}

2 个答案:

答案 0 :(得分:2)

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

来自the Socket Javadoc

public void setSoTimeout(int timeout) throws SocketException
  

使用指定的超时启用/禁用SO_TIMEOUT,以毫秒为单位。如果将此选项设置为非零超时,则与此Socket关联的InputStream上的read()调用将仅阻止这段时间。如果超时到期,则引发java.net.SocketTimeoutException,尽管Socket仍然有效。必须在进入阻止操作之前启用该选项才能生效。超时必须> 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
}

答案 1 :(得分:1)

使用异步NIO操作。 如果你使用java6,异步操作很棘手,但是有很多网络库(Mina,Netty)虽然它们很重。 如果使用java7,则实现真正的异步网络操作并且易于使用(nio2)。更容易使用来自https://github.com/rfqu/df4j的轻量级nio2库。