`
xuyongping
  • 浏览: 123965 次
  • 性别: Icon_minigender_1
  • 来自: 部落格
社区版块
存档分类
最新评论

关于Servlet 的 ServletInputStream 读出问题

阅读更多
请求帮助:
      我用发送一个异步(每次都是异步的)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( ) 也只执行一次。

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


多谢了。。。。!!
分享到:
评论
3 楼 xuyongping 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) 读出的长度是不定的。所以不能按我的条件来,


谢谢了。。。。。
2 楼 xuyongping 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()  难道不是这样用。。。。请解释一下
1 楼 codeutil 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);
 }  

发表评论

文章已被作者锁定,不允许评论。

相关推荐

    原理讲解-ServletInputStream.readLine(byte[] b, int off, int len) 方法

    `readLine(byte[] b, int off, int len)` 方法是 `ServletInputStream` 提供的一个方法,用于读取输入流中的一行数据。这个方法在处理文本数据时非常有用,因为它可以方便地按行读取数据,而不仅仅是单个字节。 在...

    springboot 解决InputStream只能读取一次的问题

    本篇文章将详细讲解如何在Spring Boot应用中解决`InputStream`只能读取一次的问题。 首先,了解`InputStream`的工作原理。`InputStream`是Java I/O中的基础类,它定义了读取字节流的基本操作。当我们尝试从`...

    servlet-api-2.4.jar.zip

    javax.servlet.ServletInputStream javax.servlet.ServletContextEvent javax.servlet.ServletOutputStream javax.servlet.ServletRequestEvent javax.servlet.http.NoBodyResponse javax.servlet....

    javax.servlet.jar下载

    javax.servlet.ServletInputStream.class javax.servlet.ServletOutputStream.class javax.servlet.FilterChain.class javax.servlet.ServletRequestEvent.class javax.servlet.Filter.class javax.servlet....

    关于InputStream和OutputStream详细讲解

    关于InputStream和OutputStream关于InputStream和OutputStream关于InputStream和OutputStream关于InputStream和OutputStream

    servlet2.4doc

    Called by the servlet container to indicate to a servlet that the servlet is being taken out of service. destroy() - Method in class javax.servlet.GenericServlet Called by the servlet container to ...

    java-servlet-api.doc

    Servlet可以通过ServletInputStream对象读取请求信息。 ServletResponse接口允许Servlet建立响应头和状态代码。通过执行这个接口,Servlet有权使用ServletOutputStream类来向客户端返回数据。 多线程和映射\r 在多...

    java web Servlet

    * java.io.InputStream:是 Servlet 输入流的接口。 * java.io.OutputStream:是 Servlet 输出流的接口。 * java.lang.Throwable:是 Servlet 异常的祖先类。 * java.io.Serializable:是 Servlet 序列化的接口。 * ...

    java InputStream读取数据问题

    当我们遇到“Java InputStream读取数据问题”时,通常涉及到如何正确、有效地使用`InputStream`及其子类来处理数据输入。 在给定的博客链接(由于实际链接无法访问,以下内容基于常见问题进行假设)中,可能讨论了...

    Servlet 使用入门.ppt

    - `ServletInputStream`允许Servlet读取客户端发送的二进制数据,例如上传的文件。 - `ServletOutputStream`则用于向客户端发送二进制数据,如下载文件或流媒体内容。 通过理解和熟练使用这些Servlet相关的概念和...

    模拟tomcat、servlet服务器

    容器管理Servlet的生命周期,处理线程安全问题,提供配置和部署选项。在模拟中,我们需要自己实现类似的功能,比如Servlet实例的创建、初始化、服务以及销毁。 8. **多线程**:为了处理并发的客户端请求,服务器...

    学习servlet的实例和参考api

    类 ServletConfig ServletOutputStream ServletContext ServletInputStream ServletResponse GenericServlet ServletRequest Servlet <br>javax.servlet.http<br>接口 类 HttpSession Cookie...

    Servlet中文2API.docx

    - `ServletException`和`UnavailableException`是Servlet相关的异常类型,前者通常表示Servlet在执行过程中遇到的问题,后者则表示Servlet无法提供服务,可能是由于缺少资源或配置错误。 在实际开发中,Servlet ...

    Jsp_Servlet_中文API档

    **九、ServletInputStream类** ServletInputStream类用于读取客户端发送到Servlet的数据流,特别是HTTP请求体中的数据。 **十、ServletOutputStream类** ServletOutputStream类用于向客户端写入数据流,通常用于...

    Flex4.6+java+servlet上传图片例子+图片上传预览

    文件存储通常涉及到文件流操作,例如使用InputStream和OutputStream。完成文件保存后,Servlet可以通过HttpServletResponse向Flex客户端返回一个响应,比如返回文件的URL,这样前端就可以根据URL显示已上传的图片。 ...

    inputstream读取数据的问题

    inputstream读取数据的问题,对你的file的帮组是很大的。

    java346888244

    import javax.servlet.ServletInputStream; import javax.servlet.http.*; import http.*; public class chat{ HttpStatusCodes HttpStatus=null; PrintStream sendmsg=null; Hashtable HttpQuery=null; static ...

    servlet上传下载文件

    Servlet技术广泛应用于文件上传和下载的功能实现,因为它们可以方便地与客户端交互并处理数据流。在本例中,我们将深入探讨如何使用Servlet来实现文件上传和下载功能。 首先,让我们了解文件上传的基本流程。当用户...

    Servlet 下 kindeditor使用!封装了servlet本地图片上传及源码说明!

    InputStream in = filePart.getInputStream(); // 保存文件到服务器 File saveFile = new File(savePath + filename); try (FileOutputStream out = new FileOutputStream(saveFile)) { byte[] buffer = new ...

    Java Servlet 中文API档.doc

    ServletInputStream用于读取客户端发送的数据,ServletOutputStream用于向客户端写入数据。 7. **ServletException和UnavailableException类**:ServletException是Servlet中常见的异常类型,表示在处理请求过程中...

Global site tag (gtag.js) - Google Analytics