Java HTTP/1.1 GET 请求 BufferedReader readLine 永不停止
Java HTTP/1.1 GET request BufferedReader readLine never stops
您好,我正在制作一个 HTTP 客户端。我正在尝试获取 google.com 的 html 代码。我有一个问题 BufferedReader.readLine() 函数无休止地阻塞,因为远程服务器显然没有发送空行?还是我的要求有误?
感谢任何帮助!
public static void main(String[] args) {
String uri = "www.google.com";
int port = 80;
Socket socket = new Socket(uri, port);
PrintWriter toServer = new PrintWriter(socket.getOutputStream(), true);
InputStream inputStream = socket.getInputStream();
get(uri, port, language, socket, toServer, inputStream);
}
public static void get(String uri, int port, String language, Socket socket, PrintWriter toServer, InputStream inputStream) {
try {
toServer.println("GET / HTTP/1.1");
toServer.println("Host: " + uri + ":" + port);
toServer.println();
// Parse header
StringBuilder stringBuilder = new StringBuilder();
BufferedReader fromServer = new BufferedReader(new InputStreamReader(inputStream));
String line;
while ((line = fromServer.readLine()) != null) {
stringBuilder.append(line);
}
System.out.println("done");
} catch (IOException e) {
e.printStackTrace();
}
}
您正在发送 HTTP/1.1 请求,该请求默认启用 HTTP keep-alive。这意味着服务器可能会在发送响应后保持 TCP 连接打开,以便接受来自客户端的更多请求。您的代码假定服务器将在响应完成后通过显式期望 readline
到 return null
关闭连接。但是由于服务器不会关闭连接(或仅在长时间超时后),readline
只会阻塞。
要解决此问题,请使用 HTTP/1.0(默认关闭 keep-alive)而不是 HTTP/1.1,或者明确告诉服务器不再发送请求通过添加 Connection: close
header。
请注意,一般来说,HTTP 比您仅看过几个示例所想的要复杂得多。您在问题中面临的问题只是对继续这条道路时将面临的更多问题的一瞥。如果您真的想实现自己的 HTTP 处理而不是使用已建立的库,请研究实际标准而不是仅仅假设特定行为。
您好,我正在制作一个 HTTP 客户端。我正在尝试获取 google.com 的 html 代码。我有一个问题 BufferedReader.readLine() 函数无休止地阻塞,因为远程服务器显然没有发送空行?还是我的要求有误?
感谢任何帮助!
public static void main(String[] args) {
String uri = "www.google.com";
int port = 80;
Socket socket = new Socket(uri, port);
PrintWriter toServer = new PrintWriter(socket.getOutputStream(), true);
InputStream inputStream = socket.getInputStream();
get(uri, port, language, socket, toServer, inputStream);
}
public static void get(String uri, int port, String language, Socket socket, PrintWriter toServer, InputStream inputStream) {
try {
toServer.println("GET / HTTP/1.1");
toServer.println("Host: " + uri + ":" + port);
toServer.println();
// Parse header
StringBuilder stringBuilder = new StringBuilder();
BufferedReader fromServer = new BufferedReader(new InputStreamReader(inputStream));
String line;
while ((line = fromServer.readLine()) != null) {
stringBuilder.append(line);
}
System.out.println("done");
} catch (IOException e) {
e.printStackTrace();
}
}
您正在发送 HTTP/1.1 请求,该请求默认启用 HTTP keep-alive。这意味着服务器可能会在发送响应后保持 TCP 连接打开,以便接受来自客户端的更多请求。您的代码假定服务器将在响应完成后通过显式期望 readline
到 return null
关闭连接。但是由于服务器不会关闭连接(或仅在长时间超时后),readline
只会阻塞。
要解决此问题,请使用 HTTP/1.0(默认关闭 keep-alive)而不是 HTTP/1.1,或者明确告诉服务器不再发送请求通过添加 Connection: close
header。
请注意,一般来说,HTTP 比您仅看过几个示例所想的要复杂得多。您在问题中面临的问题只是对继续这条道路时将面临的更多问题的一瞥。如果您真的想实现自己的 HTTP 处理而不是使用已建立的库,请研究实际标准而不是仅仅假设特定行为。