Java HTTP / 1.1 GET请求BufferedReader readLine永不停止

问题描述 投票:0回答:1

您好,我正在建立一个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();
        }

    }
java sockets http inputstream
1个回答
0
投票

您正在发送HTTP / 1.1请求,该请求默认情况下启用HTTP保持活动状态。这意味着在发送响应后,服务器可能会保持TCP连接打开,以便接受来自客户端的更多请求。相反,您的代码通过明确期望readline返回null来假设服务器将在响应完成后关闭连接。但是由于服务器不会关闭连接(或仅在长时间超时后才关闭),因此readline只会阻塞。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.