开发者社区> 问答> 正文

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();
        }

    }

问题来源:Stack Overflow

展开
收起
montos 2020-03-25 21:10:45 722 0
1 条回答
写回答
取消 提交回答
  • 您正在发送HTTP / 1.1请求,该请求默认情况下启用HTTP保持活动状态。这意味着在发送响应后,服务器可能会保持TCP连接打开,以便接受来自客户端的更多请求。相反,您的代码假定服务器在响应完成后将通过明确预期readline返回值来关闭连接null。但是由于服务器不会关闭连接(或仅在长时间超时后),因此readline它将阻塞。

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

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

    回答来源:Stack Overflow

    2020-03-25 21:11:01
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载