这几天一直在用kotlin写app,今天遇到一个OKHttp的异常报错,log中一直打印java.io.IOException: unexpected end of stream on Connection。但是这个web api我用浏览器是OK的,抓了服务器的cap包,发现也是正常的。从网上查找,貌似很多人遇到这类问题,基本方案都是在http header里面添加“connection”为“close”的包头。这样的话,服务器会主动关闭连接,但是这样的话,每次都要重新连接服务器。
重新对比看了一下cap包,发现服务器发送的数据是这样的:
第一个数据包:
HTTP/1.1 200 OK
Content-type:text/plain
Content-length:96
Accept:*/*
第二个数据包:
hello world,this is a new api
一个http包分开成2个数据包发送过来了。还好,服务器代码(https://github.com/wangsun1983/Obotcha)全是我自己写的,直接修改了服务器代码,做了一个缓存发送,尽量保证http包能用一个数据包发送。再次用okhttp连接接受数据,一切OK了!!!但是如果遇到网络异常,数据重发,其实还是能出现unexpected end of stream on Connection的,治标不治本。
从上面的试验可以判断,应该是OKHttp对于数据包的解析有问题,它没有全面考虑到各种粘包或者多个数据包分发的情况。所以怀疑如果用逐个字节发送可能会测出很多异常问题,哎,这样的开源库真心害怕用,有空还得看一下okhttp的源码,http解析这块可能要自己手撸了。
Kotlin App开发:OKHttp异常分析与解决
博主在使用Kotlin开发App时遇到OKHttp的IOException:unexpectedendofstreamonConnection。问题源于服务器将HTTP响应分成两个数据包发送,而OKHttp未能正确处理这种情况。通过修改服务器代码以确保HTTP响应在一个数据包内发送,解决了问题。但此方法并非根本解决方案,因为网络异常仍可能导致相同问题。作者推测OKHttp在解析数据包时可能存在不足,并考虑自研HTTP解析逻辑。
1905

被折叠的 条评论
为什么被折叠?



