套接字setSoTimeout澄清

时间:2012-08-09 14:40:28

标签: java

我有一个场景,其中有服务器侦听指定的ip和端口以及连接到该服务器的客户端。 现在我正在使用readline方法从服务器读取响应:

String readme=bs.readline()).   

此处bsbufferedreader个对象。我想知道在阅读回复之前我是否写过这一行

socket.setSoTimeout(1000)

如果没有响应,直到1000毫秒

套接字是否超时并断开连接,或者它是否断开套接字并在readme中提供空字符串。

2 个答案:

答案 0 :(得分:5)

实际上两者都没有。抛出SocketTimeoutException

来自docs

  

setSoTimeout

public void setSoTimeout(int timeout)
                  throws SocketException
     

使用指定的超时启用/禁用SO_TIMEOUT,以毫秒为单位。   将此选项设置为非零超时,对()调用read()   与此Socket关联的InputStream将仅阻止此操作   多少时间。如果超时到期,a   引发了java.net.SocketTimeoutException,尽管Socket仍然存在   有效。在进入阻止之前,必须启用选项   操作有效。超时必须> 0.超时为零   被解释为无限超时。

     

参数: timeout - 指定的超时,以毫秒为单位。   抛出: SocketException - 如果底层协议出现错误,例如TCP错误。

答案 1 :(得分:1)

套接字不会断开连接。相反,任何读取方法都会抛出您可能希望在程序中捕获的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)

相关问题