如果服务器超时,Socket InputStream是否读取阻塞?

如果没有收到完整请求并关闭连接,我有一台服务器在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); } 

readLine()阻塞在这里,我认为这是因为我的服务器认为我的请求没有正确终止,因此等待更多。

现在,如果45秒后通过并且我的服务器超时, readLine()解锁或等待一些Socket默认超时时间?

这取决于服务器超时时的作用。 如果它关闭连接,你会看到。 如果它只是记录消息,您可能看不到任何内容。

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

如果服务器在该超时时关闭其套接字的结尾,则readLine()将返回null

readLine()方法将阻塞,直到它收到输入或直到底层套接字read()超时结束。 您没有在读取命令上设置超时,而是在自己的套接字上设置超时。

Socket.setSoTimeout(int ms) 。

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

实际发生的还取决于服务器的作用,如果正确关闭套接字,则readLine()应抛出IOException 。 如果连接未关闭,它将等待套接字超时。