工作日报 2021.10.20 OkHttp3错误异常:unexpected end of stream

createh53个月前 (02-04)技术教程17

2021.10.20

  1. 问题澄清:
  2. Plugtest IDMS对接版本准备;
  3. 蓝牙手咪适配问题配合定位;
  4. Mcdata http彩信上传,接口方案DT联调;
  5. 河北联创项目联调;


OkHttp3错误异常: java.net.ProtocolException: unexpected end of stream 源码分析

在项目中出现这个错误的原因肯定是跟服务器返回值的响应头中Content-Length的长度有关,为了验证这个问题,我将报错接口的返数据通过抓包出来分析了一下:

可以看到响应头中返回的Content-Length的大小是1004,charset是UTF-8,那么正常情况下响应正文也就是body中的字符串按照UTF-8编码的字节长度应该等于Content-Length的大小1004,于是,我写了一下代码把正文按照UTF-8编码的字节长度打印出来,打印代码很简单,就一句话:

TQLog.e(TAG, "length = " + str.getBytes(StandardCharsets.UTF_8).length);

1

果然,打印出的长度值为length = 992,居然跟响应头中的Content-Length的值不一样!这就有问题了啊,按照OkHttp中Http1Codec类报错的方法的逻辑,source.read(sink, Math.min(bytesRemaining, byteCount))这里第二个参数,将会在1004和8k之间取最小值为1004,也就是说会直接从body的输入源对象source读取1004个字节的长度,然而实际响应正文返回字符串的长度不足1004只有992。最终source必然会不够读取返回-1,从而报错。

当然实际debug发现过程跟这个有点出入,但是差别不大,实际当bytesRemaining比byteCount小时,source.read读取时不是一次性把source读完的,这主要是有个方法导致的,但是总的bytesRemaining跟Content-Length是一致的。

相关文章

Java 和.NET,谁将“统治”未来(java和netbeans)

随着时代的变化,技术在不断发展,编程语言的重要性也在发生变化。所以,要我们在两门语言中二选一,通常很困难。在这篇文章里,我们要讨论的是 Java 和.NET 之间的“战争”。.NET 和 Java 是...

JAVA和.NET谁更优秀?你选择谁?(java和.net哪个简单)

Java和.NET都是现代流行的编程语言,它们在许多方面都有各自的优缺点和优势。下面我们将详细分析Java和.NET谁更优秀,并给出具体理由。性能:Java和.NET在性能上没有明显的区别。它们都是基...

为什么说微软开源 .Net 也拼不过 Java?

.Net 服务器端源代码的开源对于微软而言是很重大的一步。然而这个动作的影响有限,也必须说 .Net 距离追上 Java 的开放源代码可能还要很长一段时间。 关于 .Net 开放源代码的计划,微软副总...

.NET Core/.NET5/.NET6 开源项目:工作流组件

前言开源项目是众多组织与个人分享的组件或项目,作者付出的心血我们是无法体会的,所以首先大家要心存感激、尊重。请严格遵守每个项目的开源协议后再使用。尊重知识产权,共建和谐开源社区。ELSAElsa Co...

通过接口实现JAVA和.NET互调用-JNInterface

使用C#编程多年,也十分感激微软在语言架构、语法糖、编辑器等方面给自己带来的便利。但因为最近工作中有接触到JAVA,渐渐地发现的确像大家说的那样,JAVA的生态很好,要找点什么几乎都有现成的,于是自然...

java中的url 编码与解码(java urldecode解码)

在开始讨论编码解码之前,首先来明确一下问题。什么是application/x-www-form-urlencoded字符串?答:它是一种编码类型。当URL地址里包含非西欧字符的字符串时,系统会将这些字...