Java HTTP/1.1 GET请求BufferedReader readLine从未停止



你好,我正在制作一个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保持活动。这意味着服务器可能会在发送响应后保持TCP连接打开,以便接受来自客户端的更多请求。相反,您的代码假设服务器将在响应完成后通过显式地期望readline返回null来关闭连接。但是,由于服务器不会关闭连接(或者只有在长时间超时之后(,readline将只是阻塞。

要解决此问题,请使用HTTP/1.0(默认情况下保持活动状态(而不是HTTP/1.1,或者通过添加Connection: close标头明确告知服务器将不再发送请求。

请注意,一般来说,HTTP比您刚才看到的几个例子想象的要复杂得多。你在问题中面临的问题只是你在继续这条道路时将面临的更多问题的一瞥。如果您真的想实现自己的HTTP处理,而不是使用已建立的库,请研究实际的标准,而不仅仅是假设一种特定的行为。

最新更新