您好,我正在建立一个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();
}
}
问题来源:Stack Overflow
您正在发送HTTP / 1.1请求,该请求默认情况下启用HTTP保持活动状态。这意味着在发送响应后,服务器可能会保持TCP连接打开,以便接受来自客户端的更多请求。相反,您的代码假定服务器在响应完成后将通过明确预期readline返回值来关闭连接null。但是由于服务器不会关闭连接(或仅在长时间超时后),因此readline它将阻塞。
要解决此问题,请使用HTTP / 1.0(默认情况下保持活动状态)而不是HTTP / 1.1,或通过添加Connection: close标头明确告知服务器不再发送请求。
请注意,一般来说,HTTP比您仅看到一些示例时所想的复杂得多。您在问题中面临的问题只是您在继续这条道路时将面临的更多问题的一瞥。如果您真的想实现自己的HTTP处理而不是使用已建立的库,请研究实际的标准,而不只是假设特定的行为。
回答来源:Stack Overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。