浏览 6104 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-12-05
我用发送一个异步(每次都是异步的)post 请求给 一个 Servlet ,用ServletInputStream 读出发送请求的数据。代码如下(发现读出的请求数据不完整现象——当请求的数据量大于4096个字节时,有几次大于4096个字节又可以,所以只能确定在数据量较大时读出数据是不完整的): 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; } 调式的时候发现有时候请求的数据量明显大于4096个字节,但do {} while( ) 却只执行一次。 发现是因为length = sis.read(buffer);有时不是按照 buffer 的长度读出来的导致 length 的值不能与length * 2 == BUFFER_SIZE 关系匹配上,导致do {} while( ) 只执行一次。 length == BUFFER_SIZE 我也试过,do {} while( ) 也只执行一次。 我有时怀疑是客户端的发送请求是出问题了,但我在客户端检查并输出请求的数据时。发现数据总是完整的。发送时并无错误。 多谢了。。。。!! 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-12-05
你的while条件根本就是错的!!! do { length = sis.read(buffer); if (length > 0) { baos.write(buffer, 0, length); } } while (length * 2 == BUFFER_SIZE); [/cdoe] 替换成 int bLen=0; while((bLen=sis.read(buffer))>0){ outputStream.write(bytes,0,bLen); baos.write(buffer, 0, bLen); } |
|
返回顶楼 | |
发表时间:2007-12-05
codeutil 写道 你的while条件根本就是错的!!! do { length = sis.read(buffer); if (length > 0) { baos.write(buffer, 0, length); } } while (length * 2 == BUFFER_SIZE); 替换成 int bLen=0; while((bLen=sis.read(buffer))>0){ outputStream.write(bytes,0,bLen); baos.write(buffer, 0, bLen); } 你的和我的是等效的吗?,不好意思,我真的不明白有什么不同 do{}while() 难道不是这样用。。。。请解释一下 |
|
返回顶楼 | |
发表时间:2007-12-05
xuyongping 写道 codeutil 写道 你的while条件根本就是错的!!! do { length = sis.read(buffer); if (length > 0) { baos.write(buffer, 0, length); } } while (length * 2 == BUFFER_SIZE); 替换成 int bLen=0; while((bLen=sis.read(buffer))>0){ outputStream.write(bytes,0,bLen); baos.write(buffer, 0, bLen); } 你的和我的是等效的吗?,不好意思,我真的不明白有什么不同 do{}while() 难道不是这样用。。。。请解释一下 我明白了,是bLen=sis.read(buffer) 读出的长度是不定的。所以不能按我的条件来, 谢谢了。。。。。 |
|
返回顶楼 | |