关于Servlet 的 ServletInputStream 读出问题

请求帮助:
我用发送一个异步(每次都是异步的)post 请求给 一个 Servlet ,用ServletInputStream 读出发送请求的数据。代码如下(发现读出的请求数据不完整现象——当请求的数据量大于4096个字节时,有几次大于4096个字节又可以,所以只能确定在数据量较大时读出数据是不完整的):


[code] private static String getRequestBody(HttpServletRequest request)
throws IOException, UnsupportedEncodingException {

final int BUFFER_SIZE = 8 * 1024;
byte[] buffer = new byte[BUFFER_SIZE];
ServletInputStream sis = request.getInputStream();
int length = 0;
ByteArrayOutputStream baos = new ByteArrayOutputStream();

do {
length = sis.read(buffer);
if (length > 0) {
baos.write(buffer, 0, length);
}
} while (length * 2 == BUFFER_SIZE);

String bodyData = new String(baos.toByteArray(), "UTF-8");
return bodyData;
}
[/code]
调式的时候发现有时候请求的数据量明显大于4096个字节,但do {} while( ) 却只执行一次。

发现是因为[color=red]length = sis.read(buffer);[/color]有时不是按照 buffer 的长度读出来的导致

length 的值不能与[color=red]length * 2 == BUFFER_SIZE[/color] 关系匹配上,导致do {} while( ) 只执行一次。

[color=red]length == BUFFER_SIZE[/color] 我也试过,do {} while( ) 也只执行一次。

我有时怀疑是客户端的发送请求是出问题了,但我在客户端检查并输出请求的数据时。发现数据总是完整的。发送时并无错误。


多谢了。。。。!!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值