4

如果服务器没有收到完整的请求并关闭连接,我的服务器会在 45 秒后超时。我通过 a 连接到该服务器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默认超时时间?

4

3 回答 3

6

这取决于服务器在超时时会做什么。如果它关闭连接,您将看到。如果它只是记录一条消息,您可能什么也看不到。

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

于 2012-12-19T16:46:15.050 回答
1

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

于 2012-12-19T16:47:41.540 回答
1

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

Socket.setSoTimeout(int ms)

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

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

于 2012-12-19T17:01:35.710 回答