[英]Socket setSoTimeout clarification
我有一种方案,其中有服务器在指定的IP和端口上侦听,并且有客户端连接到该服务器。 现在,我正在使用readline
方法从服务器读取响应:
String readme=bs.readline()).
这里bs
是bufferedreader
对象。 我想知道在阅读回复之前是否写这行
socket.setSoTimeout(1000)
如果没有响应,直到1000毫秒
套接字是否超时并断开连接,还是不断开套接字并在readme
提供空字符串。
实际上两者都不是。 抛出SocketTimeoutException
。
从文档 :
setSoTimeout
public void setSoTimeout(int timeout) throws SocketException
以指定的超时时间启用/禁用SO_TIMEOUT,以毫秒为单位。 通过将此选项设置为非零超时,与此套接字关联的InputStream上的read()调用将仅在此时间量内阻塞。 如果超时到期,则尽管Socket仍然有效,但将引发java.net.SocketTimeoutException。 必须先启用该选项,然后才能执行阻止操作。 超时必须大于0。零超时被解释为无限超时。
参数:
timeout
指定的超时(以毫秒为单位)。 抛出:SocketException
如果基础协议中存在错误,例如TCP错误。
插座不会断开。 相反,任何读取方法都将引发您可能希望在程序中捕获的SocketTimeoutException。 套接字仍然可以使用,但是在这种情况下将无法定义readme
:
String readme;
try
{
readme = bs.readline;
// TODO do stuff with readme
}
catch (SocketTimeoutException e)
{
// did not receive the line. readme is undefined, but the socket can still be used
socket.close(); // disconnect, for example
}
在示例中假定IOException
被捕获在其他地方或被抛出。
该文档很好地解释了此行为: Socket.setSoTimeout(int)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.