我们有一个套接字应用程序,其中while循环的片段如下所示。我们想要检查的是,如果它通过30秒并且没有更多数据然后关闭套接字连接。如果某些数据存在于事件中,则我们重置计时器。我必须使用计时器或系统毫秒
while ((readChar=readSocket.read()) != -1)
{
//processing.
}
答案 0 :(得分:2)
您可以配置套接字,以便在指定的时间间隔内没有收到数据时读取操作超时。
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库。