上文中我们提到了HttpDNS
,虽然它比系统DNS更优,但终归还是要做DNS操作。而长连接都是IP直接连接,因此没有DNS相关的开销和耗时。
3. 如果有大量网络请求,可以明显减少网络延时,节省带宽
对于大型App而言,存在繁多密集的网络请求,这中间就会存在非常多次的Http断开和重新连接,浪费了很多时间和带宽。而通过长连接通道的话,则没有这部分耗时,直接传输二进制数据即可,节省了每次连接里Header之类的带宽开销。
4. 服务端主动Push数据到客户端
对于上面提到的微信消息接收等场景,如果需要客户端主动去轮询,则会频繁发起请求,对于服务器会产生很大的负载压力,浪费带宽流量。而通过长连接,服务端可以主动把消息下发给客户端,做到最高实时性,且节省流量。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xuKLZuin-1650012443119)(https://user-gold-cdn.xitu.io/2019/2/12/168df9c1c2ba7115?imageView2/0/w/1280/h/960/ignore-error/1)]
III. 长连接何时会断开?
正常而言,长连接是不会断开的。大家可以自己试一试,两个socket建立连接,只要网络不变、一切正常,那么这两个socket可以一直互相传送数据,不会断开。
但是,在移动网络下,网络状态复杂多变,比如网络线路被切断、服务器宕机等,都会导致长连接中断。除了这些线路异常外,我们需要关注下面几个长连接断开原因:
1. 长连接所在进程被杀
这个很容易理解,如果我们的App切换到后台,那么系统随时可能将我们的App杀掉,这时长连接自然也就随之断开。
2. 用户切换网络
比如手机网络断开,或者发生Wi-Fi和蜂窝数据切换,这时会导致手机IP地址变更。而我们知道,TCP连接是基于IP + Port的,一旦IP变更,TCP连接自然也就失效了,或者说长连接也就相当于断开了。
3. 系统休眠等导致NAT超时
这里对NAT简单解释下,方便有的同学不太了 Android开源项目《ali1024.coding.net/public/P7/Android/git》 解。当手机连接上网络时ÿ