Socket InputStream在服务器超时时是否会解除阻塞?

4

我有一个服务器,如果没有接收到完整的请求并关闭连接,它将在45秒后超时。我通过 Socket 连接到这个服务器,并将我的请求写入套接字的 OutputStream

Socket socket = new Socket("myhost", myPort);
PrintWriter out = new PrintWriter(socket.getOutputStream());
out.write(properRequestMessage);
out.flush();

我假设我的请求是正确的(遵循了我的协议)。服务器应该以文件形式响应。我尝试从套接字输入流中读取:

BufferedReader response = new BufferedReader(new InputStreamReader(socket.getInputStream()));

String in;

while((in = response.readLine()) != null) {
    System.out.println(in);
}
< p > readLine() 在这里阻塞,我认为是因为我的服务器认为我的请求没有正确终止,因此正在等待更多的请求。

现在,如果45秒钟过去,我的服务器超时,readLine()会解除阻塞,还是会等待一些Socket默认的超时时间?


你是如何在服务器上配置超时时间的?超时时间到达后会发生什么? - Vikdor
3个回答

6

这取决于服务器超时时的操作。如果它关闭连接,您将看到该情况。如果它只记录消息,则您可能看不到任何内容。

没有默认的读取超时。您的readLine()可能会永远等待。


我的服务器关闭了连接。你的意思是我会看到这个吗?readLine() 会在 in == null 的情况下解除阻塞并跳出循环? - Sotirios Delimanolis
这就是文档所说的当流结束时会发生的事情。 ;) - Peter Lawrey

1
如果服务器在超时时关闭套接字的端口,则{{link1:readLine()}}将返回null。该内容与IT相关。

1

readLine() 方法将会阻塞,直到它接收到输入或者底层的 socket read() 超时结束。你不需要在读取命令上设置超时时间,而是在 socket 上设置。

Socket.setSoTimeout(int ms)

使用指定的毫秒数启用/禁用 SO_TIMEOUT。当此选项设置为非零超时时,与此 Socket 关联的 InputStream 上的 read() 调用仅会阻塞这段时间。如果超时时间到期,则会引发 java.net.SocketTimeoutException,但 Socket 仍然有效。必须在进入阻塞操作之前启用该选项才能生效。超时时间必须大于 0。超时时间为零被解释为无限超时。

实际发生的情况还取决于服务器的操作,如果它正确地关闭了 socket,则 readLine() 应该抛出 IOException。如果连接没有关闭,它将等待 socket 超时。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接