(一)、HTTP分块传输(chunked)

分块传输编码

Http有长连接和短连接两种方式;短连接即一次请求对应一次TCP连接的建立和销毁过程,而长连接是多个请求共用同一个连接这样可以节省大量连接建立时间提高通信效率。请求头里面的字段Connection:keep-alive字段就是告诉HTTP服务器响应结束后不要关闭连接,浏览器会将连接缓存起来,当在有限时效内有再次对相同服务器发送请求时则直接从缓存中取出连接进行通信。当然被缓存的连接如果空闲时间超过了设定值则会关闭连接。

当使用短连接的时,可以通过服务器端对连接的关闭来获得消息体的结束位置;但长连接的时候,我们主要采用设置响应头Content-Length或者Transfer-Encoding:chunked的方法来解析消息体。

分块传输编码是超文本传输协议中的一种数据传输机制,允许HTTP由网页服务器发送给客户端应用的数据可以分成多个部分。分块传输编码只在HTTP协议1.1版本中提供。在一般情况下,HTTP应答消息中发送的数据是整个发送的,Content-Length消息头字段表示数据的长度。客户端通过它来解析消息。然而,对于分块传输编码来说,它会把数据分解成一系列数据块,并以一个或多个块发送。

优点

对于动态生成的内容来说,在内容创建完之前是不可知的。分块传输能很好的解决这种情形的传输编问题,它允许服务器在最后发送消息头字段。这样对于传输数据时,不需要等到所有的内容都计算好后在进行。对于传输的数据有时使用压缩以缩短传输花费的时间。而使用分块传输可以分隔压缩对象的多个部分。

Chunked消息体格式

hex的分块长度+<CR>回车+<LF>换行
chunked data
结束块的分块长度为0

举例:
如要发送的内容(消息体)为:abcd那么消息体的格式为:

4<CR><LF>
abcd<CR><LF>
0<CR><LF>
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个使用HttpPost进行chunked分块传输的示例代码: ```java import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.util.EntityUtils; public class ChunkedHttpPostDemo { public static void main(String[] args) { try { // 创建HttpClient对象 HttpClient httpClient = HttpClientBuilder.create().build(); // 创建HttpPost对象,并设置URL HttpPost httpPost = new HttpPost("http://example.com/api"); // 设置请求体为chunked分块传输 StringEntity entity = new StringEntity("This is a chunked request body"); entity.setChunked(true); httpPost.setEntity(entity); // 执行请求并获取响应 HttpResponse response = httpClient.execute(httpPost); // 获取响应实体 HttpEntity responseEntity = response.getEntity(); // 解析响应内容 String responseBody = EntityUtils.toString(responseEntity); // 输出响应内容 System.out.println("Response: " + responseBody); // 关闭连接 httpClient.getConnectionManager().shutdown(); } catch (Exception e) { e.printStackTrace(); } } } ``` 这个示例代码使用Apache HttpComponents库来发送HttpPost请求。通过设置`StringEntity`的`setChunked(true)`方法,可以将请求体进行chunked分块传输。然后,将`StringEntity`对象设置到`HttpPost`对象中的`setEntity`方法中。最后,执行请求并获取响应,解析响应内容并输出。 请注意,需要添加Apache HttpComponents库的依赖,例如在Maven项目中,可以在pom.xml文件中添加以下依赖: ```xml <dependencies> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.13</version> </dependency> </dependencies> ``` 希望这可以帮助到你!如果你还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值