请求帮助:
我用发送一个异步(每次都是异步的)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 11:21
- 浏览 9682
- 评论(3)
- 论坛回复 / 浏览 (3 / 6105)
- 查看更多
相关推荐
`readLine(byte[] b, int off, int len)` 方法是 `ServletInputStream` 提供的一个方法,用于读取输入流中的一行数据。这个方法在处理文本数据时非常有用,因为它可以方便地按行读取数据,而不仅仅是单个字节。 在...
本篇文章将详细讲解如何在Spring Boot应用中解决`InputStream`只能读取一次的问题。 首先,了解`InputStream`的工作原理。`InputStream`是Java I/O中的基础类,它定义了读取字节流的基本操作。当我们尝试从`...
javax.servlet.ServletInputStream javax.servlet.ServletContextEvent javax.servlet.ServletOutputStream javax.servlet.ServletRequestEvent javax.servlet.http.NoBodyResponse javax.servlet....
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
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 ...
Servlet可以通过ServletInputStream对象读取请求信息。 ServletResponse接口允许Servlet建立响应头和状态代码。通过执行这个接口,Servlet有权使用ServletOutputStream类来向客户端返回数据。 多线程和映射\r 在多...
* java.io.InputStream:是 Servlet 输入流的接口。 * java.io.OutputStream:是 Servlet 输出流的接口。 * java.lang.Throwable:是 Servlet 异常的祖先类。 * java.io.Serializable:是 Servlet 序列化的接口。 * ...
当我们遇到“Java InputStream读取数据问题”时,通常涉及到如何正确、有效地使用`InputStream`及其子类来处理数据输入。 在给定的博客链接(由于实际链接无法访问,以下内容基于常见问题进行假设)中,可能讨论了...
- `ServletInputStream`允许Servlet读取客户端发送的二进制数据,例如上传的文件。 - `ServletOutputStream`则用于向客户端发送二进制数据,如下载文件或流媒体内容。 通过理解和熟练使用这些Servlet相关的概念和...
容器管理Servlet的生命周期,处理线程安全问题,提供配置和部署选项。在模拟中,我们需要自己实现类似的功能,比如Servlet实例的创建、初始化、服务以及销毁。 8. **多线程**:为了处理并发的客户端请求,服务器...
类 ServletConfig ServletOutputStream ServletContext ServletInputStream ServletResponse GenericServlet ServletRequest Servlet <br>javax.servlet.http<br>接口 类 HttpSession Cookie...
- `ServletException`和`UnavailableException`是Servlet相关的异常类型,前者通常表示Servlet在执行过程中遇到的问题,后者则表示Servlet无法提供服务,可能是由于缺少资源或配置错误。 在实际开发中,Servlet ...
**九、ServletInputStream类** ServletInputStream类用于读取客户端发送到Servlet的数据流,特别是HTTP请求体中的数据。 **十、ServletOutputStream类** ServletOutputStream类用于向客户端写入数据流,通常用于...
文件存储通常涉及到文件流操作,例如使用InputStream和OutputStream。完成文件保存后,Servlet可以通过HttpServletResponse向Flex客户端返回一个响应,比如返回文件的URL,这样前端就可以根据URL显示已上传的图片。 ...
inputstream读取数据的问题,对你的file的帮组是很大的。
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来实现文件上传和下载功能。 首先,让我们了解文件上传的基本流程。当用户...
InputStream in = filePart.getInputStream(); // 保存文件到服务器 File saveFile = new File(savePath + filename); try (FileOutputStream out = new FileOutputStream(saveFile)) { byte[] buffer = new ...
ServletInputStream用于读取客户端发送的数据,ServletOutputStream用于向客户端写入数据。 7. **ServletException和UnavailableException类**:ServletException是Servlet中常见的异常类型,表示在处理请求过程中...