我有一个客户发送数据块。我的服务器应该读取这些数据。在服务器上,我使用的是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将提供大小可变的块。你将得到第一行中每个块的大小。协议非常简单,所以您可以自己实现它。