Socket HTTP请求返回无效的GZIP

时间:2015-03-01 21:48:20

标签: java sockets http gzip

我正在教自己更多关于HTTP请求等等,因此我使用Java的HttpURLConnection类编写了一个简单的POST请求,它返回了易于解压缩的压缩数据。我决定进入较低级别并使用套接字发送HTTP请求(用于练习)。我在一系列谷歌搜索后想出来了,但有一个问题。当服务器使用压缩数据进行响应时,它无效。这是一个调试的图像。 http://i.imgur.com/KfAcero.png

“=”分隔线下面的部分是使用HttpURLConnection实例时的响应,但是它上面的部分是使用套接字时的响应。我不太清楚这里发生了什么。底部是有效的,而顶部则不是。

HttpParameter和header类只存储一个键和值。

public String sendPost(String host, String path, List<HttpParameter> parameters, List<HttpHeader> headers) throws UnknownHostException, IOException {
    String data = this.encodeParameters(parameters);
    Socket socket = new Socket(host, 80);
    PrintWriter writer = new PrintWriter(socket.getOutputStream());
    BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    writer.println("POST " + path + " HTTP/1.1");
    for(HttpHeader header : headers) {
        writer.println(header.getField() + ": " + header.getValue());
    }
    writer.println();
    writer.println(data);
    writer.flush();
    StringBuilder contentBuilder = new StringBuilder();
    for(String line; (line = reader.readLine()) != null;) {
        contentBuilder.append(line + "\n");
    }
    reader.close();
    writer.close();
    return contentBuilder.toString();
}

1 个答案:

答案 0 :(得分:1)

您的问题是,您使用ReaderWriter来处理不是文字的内容。

InputStreamOutputStream使用字节; ReaderWriter使用编码文本。如果您尝试将ReaderWriter用于非编码文本的内容,则会破坏它。

使用Writer发送请求很好。

你想做这样的事情:

InputStream in = socket.getInputStream();

// ...

ByteArrayOutputStream contentBuilder = new ByteArrayOutputStream();
byte[] buffer = new byte[32768]; // the size of this doesn't matter too much
int num_read;
while(true) {
    num_read = in.read(buffer);
    if(num_read < 0)
        break;
    contentBuilder.write(buffer, 0, num_read);
}
in.close();
writer.close();
return contentBuilder.toByteArray();

并使sendPost返回一个字节数组。