我们有一个套接字应用程序,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.