我有一个客户发送数据块。我的服务器应该读取这些数据。在服务器上,我使用的是Tomcat 7.0.42,并希望通过现有servlet加载该数据。
我在google上查了一下,想看看能不能找到任何读分块数据的例子,不幸的是,我没有偶然发现。
我发现很少有apache http客户端提供的chunkedinputstream或tomcat提供的chunkedinputfilter的引用。但我找不到任何合适的例子来说明如何最好地使用这些。
如果你们中的任何人有阅读/解析分块数据的经验,请分享这些数据的指针。
使用的Java版本-1.7.0.45
在我现有的servlet代码中,我一直在使用POST处理简单请求。但现在,如果客户机将transfer encoding设置为chunked,我需要特别处理这个问题。所以我有一个分叉代码。像下面这样,

inputStream = httpServletRequest.getInputStream();

if ("chunked".equals(getRequestHeader(httpServletRequest, "Transfer-Encoding"))) {
   // Need to process chunked data
} else {
   // normal request data
   if (inputStream != null) {
     int contentLength = httpServletRequest.getContentLength()
     if (contentLength <= 0) {
        return new byte[0];
     }
     ReadableByteChannel channel = Channels.newChannel(inputStream);
     byte[] postData = new byte[contentLength];
     ByteBuffer buf = ByteBuffer.allocateDirect(contentLength);
     int numRead = 0;
     int counter = 0;
     while (numRead >= 0) {
        buf.rewind();
        numRead = channel.read(buf);
        buf.rewind();
        for (int i = 0; i < numRead; i++) {
           postData[counter++] = buf.get();
        }
     }
     return postData;
  }
}

因此,如果您观察到,正常的请求情况是基于可用的“内容长度”,而对于分块编码,则不存在这种情况。因此,还有一个处理分块数据的替代过程。
谢谢,
维姬

最佳答案

HTTP 1/1 Chunked Transfer Coding
Servlet将提供大小可变的块。你将得到第一行中每个块的大小。协议非常简单,所以您可以自己实现它。

07-24 19:54
查看更多