TCP Socket HTTP GET 请求 Content-Length > 0 但不返回实际内容

我正在尝试使用 TCP 套接字而不是 HTTPClient 查询托管在 Tomcat/Spring Boot 应用程序上的 REST API 服务,因为我不能使用 HTTPClient。我能够成功打开套接字、发送请求并从服务器接收数据,但服务器响应中从未返回任何正文或内容。如果我使用网络浏览器查询相同的 URL,它就可以正常工作。这是我用来发出请求的程序:


import java.io.BufferedReader;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.io.PrintWriter;

import java.net.Socket;


public class SocketClient {


    public SocketClient() {

        String hostname = "192.168.10.104";

        int port = 8080;


        try (Socket socket = new Socket(hostname, port)) {


            OutputStream output = socket.getOutputStream();

            PrintWriter writer = new PrintWriter(output, false);


            writer.println("GET /company/1 HTTP/1.1");

            writer.println("Host: " + hostname + ":" + port);

            writer.println("User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36");

            writer.println("Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8");

            writer.println("Accept-Language: en-US,en;q=0.9");

            writer.println("Accept-Encoding: gzip, deflate, br");

            writer.println("Connection: close");

            writer.println();

            writer.flush();


            InputStream input = socket.getInputStream();


            BufferedReader reader = new BufferedReader(new InputStreamReader(input));


            String line;


            while (!(line = reader.readLine()).equals("")) {

                System.out.println(line);

            }

            socket.close();

        } catch (Exception ex) {


            System.out.println("Server not found: " + ex.getMessage());


        }


    }

}

服务器响应以下数据:


HTTP/1.1 200 

Content-Type: text/html;charset=UTF-8

Content-Length: 55

Date: Thu, 24 Jan 2019 15:45:00 GMT

Connection: close

响应表明应该有一些基于 Content-Length 的内容,但我从未真正收到内容本身。是否有可能做到这一点?任何意见是极大的赞赏。


慕神8447489
浏览 233回答 1
1回答

慕田峪4524236

当你发现一个空行时,你停止阅读。有一个空行将标题与内容分开,所以你只是没有阅读内容。当服务器关闭连接时,readLine 返回 null。将循环更改为while (!(line = reader.readLine()) == null)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java