我正在教自己更多关于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();
}
答案 0 :(得分:1)
您的问题是,您使用Reader
和Writer
来处理不是文字的内容。
InputStream
和OutputStream
使用字节; Reader
和Writer
使用编码文本。如果您尝试将Reader
和Writer
用于非编码文本的内容,则会破坏它。
使用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
返回一个字节数组。