我有一个场景,其中有服务器在指定的 ip 和端口上侦听以及连接到该服务器的客户端。现在我正在使用readline
方法从服务器读取响应:
String readme=bs.readline()).
这里bs
是bufferedreader
对象。我想知道在阅读回复之前是否写了这一行
socket.setSoTimeout(1000)
如果直到 1000 毫秒没有响应
套接字是否超时并断开连接,或者它不断开套接字并在readme
.
我有一个场景,其中有服务器在指定的 ip 和端口上侦听以及连接到该服务器的客户端。现在我正在使用readline
方法从服务器读取响应:
String readme=bs.readline()).
这里bs
是bufferedreader
对象。我想知道在阅读回复之前是否写了这一行
socket.setSoTimeout(1000)
如果直到 1000 毫秒没有响应
套接字是否超时并断开连接,或者它不断开套接字并在readme
.
其实也没有。ASocketTimeoutException
被抛出。
从文档:
setSoTimeout
public void setSoTimeout(int timeout) throws SocketException
使用指定的超时启用/禁用 SO_TIMEOUT,以毫秒为单位。将此选项设置为非零超时,对与此 Socket 关联的 InputStream 的 read() 调用将仅阻塞此时间量。如果超时到期,则会引发 java.net.SocketTimeoutException,尽管 Socket 仍然有效。必须在进入阻塞操作之前启用该选项才能生效。超时必须 > 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
s 在其他地方被捕获或被抛出。
文档很好地解释了这种行为:Socket.setSoTimeout(int)