socket长连接的用处与模块图

来源:互联网 发布:联盟挂机赚钱软件 编辑:程序博客网 时间:2024/06/06 04:15

维护socket长连接虽然很耗电,但是却有广泛的用途。如:网络电话,实时接单的应用等。
很多小公司为了减少开发难度,用个推当派单的方式,这样的做法是架构上的错误。个推不能参与业务,只能当简单的消息提示用。个推在高峰期延迟很严重,不同的人收到延迟10秒--30分钟很正常。就会出现有的用户收到推送的消息,有的用户收不到消息或收到时早过期的情况。这种有实时群推送的业务一定要用长连接。不然每个公司通过个推服务器做,那样也太容易了吧?怎么可能呢?若你的业务不是对实时性要求很高可以用第三方socket库,若你的应用对实时性,复杂移动网络,粘包处理要求很高,那还是自己写长连接吧!
由于服务器域名固定,手机客户端的网络IP可能不断变更,服务器一般想主动找手机客户端想说声不容易。运营商发现手机经常不用网络时(大部分省份判断手机客户端最近30分钟内是否使用流量,来判断你的手机是否在用网络,若有流量就不把你IP分给别人),会把你的手机以前使用的IP分配给其它手机号,所有苹果把苹果手机网络定义为不稳定的网络,禁止发布的应用严重依赖网络的稳定性。所以服务和客户端只有建立可靠的socket长连接,每9分钟发送一次请求才能保持你IP不分配给别人,并且有服务需要向客户端下达订单时,可以通过这个长连接快速推送到手机客户端。要别APNS转了一大圈稳定,延迟小,也解决苹果对短期内推送大量类似信息被苹果服务器拦截的问题。
网络电话的原理也很简单。两个手机开启应用,经过服务器建立SOCKET长连接声音和视频格式流媒体数据流就可以了,当然要打电话是,对方收到网络电话请求消息时,弹出本地通知播放一段音乐就就可以了。网络电话简单吧!是否有开公司的冲动。这也是电话,电报的基本原理,他们都要通过服务器中转,服务器起到早期的电话接线员的角色。
尽量把业务逻辑放在SOCKET的子线程里面处理,尽量减少外部接口,要把外部接口设计成不会并发发送的接口。你想一想,你把业务接口都封装为外部接口,当你调用外部接口发送请求时,若子线程没有在访问发送对象数组,会把发送消息写入发送对象数组;若子线程在访问发送对象数组,你只能把外部发送的消息放入临时消息中,若此时你竟敢放入发送对象数组就会出现发送对象数组长度的变法,众所周知,当一个线程在访问一个数组时,若数组元素个数变化,会出现数组越界或数组个数不可以预知的崩溃。这个我在测试时实际遇到过,并且截获到崩溃桟。
所以若有能力还是自己写SOCKET,把自己的业务逻辑也包含进来,尽量减少外部调用接口,禁止通过SOCKET并发发送消息,把你的需要返回的外部接口通过BLOCK进行封装。若有能力尽量别用第三方SOCKET库,不然它封装的是很好,但是越适用的场景广泛,那么针对个别特殊情况的处理越力不从心。如:第三方库从来没有考虑过SOCKET建立完成,有的情况可读不可写的情况,网卡缓冲区满了就会出现可读不可以
写的情况。通用和全面本来就不可以兼得,全面必然会让你的程序复杂。通用就要求简洁,符合大部分要求,而非全部场景。

SOCKET模块图:可以看到SOCKET连接区域和线程内部业务处理区域是两个死循环。
这里写图片描述

0 0
原创粉丝点击