Java HTTP Socket流的结束?

时间:2018-03-17 10:58:35

标签: java sockets http

对于网络作业,我们需要创建一个HTTP客户端(版本1.1)。问题是

OutputStream output = socket.getOutputStream();
PrintWriter writer = new PrintWriter(output, true);

writer.println("GET / HTTP/1.1");
writer.println("Host: " + uri.getHost());
writer.println("Accept: text/html");
writer.println();

InputStream input = socket.getInputStream();

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

String line;
StringBuilder builder = new StringBuilder();

while ((line = reader.readLine()) != null) {
    builder.append(line);
}
return builder.toString();

挂起在输入的末尾,因为我们使用http 1.1,我们不能简单地关闭连接。那么如何检测输入的结束?

1 个答案:

答案 0 :(得分:1)

  

那么如何检测输入结束?

遵循标准。 RFC 2616 section 4.4清楚地描述了如何指定消息长度。简而言之,按此顺序:

  • 一些回复代码表示根本没有身体
  • 如果使用了Transfer-Encoding chunked,则前面的长度是未知的,而是响应由几个块组成,每个块都以长度为前缀
  • 如果给出了Content-length标头,则它包含长度
  • 内容类型multipart / byteranges的响应根据MIME规范
  • 结束
  • 最后响应可能会在服务器关闭连接时结束