Java,格式错误的ChunkCodingException

Java,格式错误的ChunkCodingException,java,android,apache,http,Java,Android,Apache,Http,我有一个Android应用程序,它给了我一个例外: org.apache.http.MalformedChunkCodingException: CRLF expected at end of chunk 此方法引发异常:(目的是将从服务器收到的响应写入文件。) 因此,我将上述代码修改为: public static void getResponseBodyForServerData( final HttpEntity entity) throws IOException, Parse

我有一个Android应用程序,它给了我一个例外:

org.apache.http.MalformedChunkCodingException: CRLF expected at end of chunk
此方法引发异常:(目的是将从服务器收到的响应写入文件。)

因此,我将上述代码修改为:

public static void getResponseBodyForServerData(
    final HttpEntity entity) throws IOException, ParseException {

    if (entity == null) {
        throw new IllegalArgumentException("HTTP entity may not be null");
    }
    InputStream instream = entity.getContent();
    InputStreamReader inputStreamReader = new InputStreamReader(
        instream, "UNICODE") ;

    if (instream == null) {
        return;
    }
    File file = new File(Environment.getExternalStorageDirectory() + 
        "/foo/Response.txt");
    if (!file.exists()) {
        file.createNewFile();
    }

    BufferedReader bufferedReader = new BufferedReader(inputStreamReader) ;
    BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(
        new FileOutputStream(file),"UNICODE")) ;

    String singleLine = null ;

    while((singleLine = bufferedReader.readLine()) != null) {
        bufferedWriter.write(singleLine) ;
    }

    bufferedWriter.flush() ;
    bufferedWriter.close() ;
}

然后代码就开始工作了,是什么导致了这个错误,以及原始代码有什么问题?

我发现这个问题已经很老了,但是当我搜索MalformedChunkCodingException时,它出现了。所以这里有一些提示

我只能猜测您的问题是什么,因为您没有告诉我们异常发生在哪一行以及您使用的org.apache.http.HttpEntity的哪个版本

第一个
格式错误的chunkcodingException:CRLF应该出现在块的末尾
才是问题所在。 如果您有一个,并且该传输中至少缺少一个
\r\n
,则会发生此错误

有两种可能的错误。首先,服务器不发送它们,或者客户端将其释放

要检查服务器是否正常,请检查请求响应是否正常。例如,您可以使用curl查看十六进制格式的响应:

curl -ivs --raw http://host:port/somePath/toResource --trace /dev/stdout
以下是一些示例输出:

00a0: 30 31 22 7d 5d 0d 0a 30 0d 0a 0d 0a             01"}]..0....
是否将输出中的
\r\n
视为
0d 0a
? 这意味着服务器实际上发送了正确的消息

因此,在读取响应时可能会丢失一些字节

我使用了一个调试器并为MalformedChunkCodingException(Eclipse中的Java异常断点)设置了一个断点。我查看了第一次处理传入响应的堆栈,实际上缓冲区中只有一半响应

分块消息是流式消息。因此,可能是您在InputStream读取完整消息之前关闭了套接字。 例如,这件事发生在美国

他们有这样的密码:

return new FilterInputStream(inputStream) {
    @Override
    public void close() throws IOException {
        response.close();
        super.close();
    }
失败的:

Julianjanasjezov于2016年10月18日

此更改不适用于org.apache.httpcomponents: httpclient:4.5.1+当使用分块传输编码时。这是 因为他们改变了关闭连接的方式

在本例中,当调用response.close()时,连接关闭 然后清除输入流的缓冲区,然后使用super.close()函数 无法关闭ChunkedInputStream并导致 org.apache.http.ConnectionClosedException:块过早结束 编码消息正文:应为关闭区块

异常发生的原因是在 ChunkedInputStream,close()函数读取 分块消息,它失败,因为流的缓冲区已被删除 在响应.close()调用中关闭连接时清除。 参考:

解决此问题的方法是将super.close()行代码放在 响应。close()。这允许关闭流 在其缓冲区被清除之前正确


因此,当我发现在我们的项目中,我们在maven pom中使用了(旧的)和(新的)不兼容的版本时,我的问题就解决了。(Dependency Hierachy说:
httpclient:4.5.3(从4.5开始管理)(因与4.5.3冲突而提交)

您是否通过代理加载?因为每次我看到这个异常,伙计们都是通过代理加载的,通过删除或更改缓冲区大小来纠正错误。你是说网络代理吗?
return new FilterInputStream(inputStream) {
    @Override
    public void close() throws IOException {
        response.close();
        super.close();
    }