论坛首页 Java企业应用论坛

关于Servlet 的 ServletInputStream 读出问题

浏览 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( ) 也只执行一次。

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


多谢了。。。。!!
   发表时间: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);
 }  

0 请登录后投票
   发表时间: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()  难道不是这样用。。。。请解释一下
0 请登录后投票
   发表时间: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) 读出的长度是不定的。所以不能按我的条件来,


谢谢了。。。。。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics