这几天一直在用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解析这块可能要自己手撸了。