HttpClient接收数据的问题

背景:
竞价大厅和支持系统进行项目的部署和竞价数据回调时,涉及到了传输XML文件。
发送端采用的是HttpClient技术,将XML格式的String作为Http的Body发送。

原先的做法:
接收端通过Jsp的request对象的getInputStream()方法获取输入流,然后用read()方法,将输入流按照byte读取,存入byte[],然后还原成对应编码的String,并进行解析。

大厅升级时,遇到的问题:
由于涉及多产品,发送端的数据量大大增加。如果发现String长度如果超过4K多,就会报告XML解析报错。
逐一调试分析,发现错误的核心是inputstream.read()方法,该方法只接收到了4096个byte。
使用inputstream.read(byte[], int off, int len )方法指定长度也不行,还是只读4096个字节。

解决:
增加一个缓冲,采用BufferedReader读取inputstream,然后针对BufferedReader逐行读取,则接收完全正常。

原因分析:
没发现inputStream读取有长度限制;写了个读file的Demo测试inputStream的read方法,再次确定不存在长度的问题。
对inputStream作2次read(),发现第二次是从第4097个字节开始往下读,看来问题和缓冲相关。
翻翻HttpClient的源代码,基本确定原因是:HttpClient的传输协议是对Socket进行了封装,而默认Socket的缓冲大小4096。Socket缓冲满了就flush,发送给客户端,那么如果接收端没有用缓冲接收,一次最大只能解收到4096个字节。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值