我有一台服务器在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
默认超时时间?
答案 0 :(得分:6)
这取决于服务器超时时的作用。如果它关闭连接,你会看到。如果它只记录一条消息,您可能看不到任何内容。
没有默认的读取超时。 readLine()可以永远等待。
答案 1 :(得分:1)
如果服务器 关闭 超时的套接字结束,则readLine()
将返回null
。
答案 2 :(得分:1)
readLine()
方法将阻塞,直到收到输入或直到底层套接字read()
超时结束。
您没有在读取命令上设置超时,而是在自己的套接字上设置超时。
使用指定的超时启用/禁用SO_TIMEOUT,以毫秒为单位。如果将此选项设置为非零超时,则与此Socket关联的InputStream上的read()调用将仅阻止这段时间。如果超时到期,则引发java.net.SocketTimeoutException,尽管Socket仍然有效。必须在进入阻止操作之前启用该选项才能生效。超时必须> 0.超时为零被解释为无限超时。
实际发生的事情还取决于服务器的作用,如果它正确关闭了套接字,则应IOException
抛出readLine()
。如果连接未关闭,它将等待套接字超时。