背景:
竞价大厅和支持系统进行项目的部署和竞价数据回调时,涉及到了传输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个字节。