即时通讯

第一种方式,使用第三方IM服务, 比如: 网易云信、环信、融云、LeanCloud、阿里云、腾讯云、阿里悟空、极光IM即时通讯云、云之讯、容联云通讯

环信: 日活30万以下免费使用(免费+收费)
LeanCloud(按需收费)
融云(免费+收费)
阿里悟空(暂时免费)
网易云信(按需收费)
腾讯云通信IM(暂时免费)
云之讯(免费+收费)
极光IM即时通讯云(免费+收费)

.

第三方服务商IM底层协议基本上都是TCP, 都已经封装好了, 不用我们去管, 直接拿来使用, 甚至连UI都不需要自己做, 这些第三方有各自一套IM的UI,拿来就可以直接用。真可谓3分钟集成...
缺点也很明显: 很多东西我们不可控; 当然还有一个最最重要的一点,就是太贵了...

另外一种方式,我们自己去实现

基于Scoket原生:代表框架 CocoaAsyncSocket。
基于WebScoket:代表框架 SocketRocket。
基于MQTT:代表框架 MQTTKit。
基于XMPP:代表框架 XMPPFramework。

.

其中MQTT和XMPP为聊天协议,它们是最上层的协议,
而WebScoket是传输通讯协议,它是基于Socket封装的一个协议。
而通常我们所说的腾讯IM的私有协议,就是基于WebScoket或者Scoket原生进行封装的一个聊天协议。

我们真正需要心跳机制的原因其实主要是在于国内运营商NAT超时。
原来这是因为IPV4引起的,我们上网很可能会处在一个NAT设备(无线路由器之类)之后。
NAT设备会在IP封包通过设备时修改源/目的IP地址.
对于家用路由器来说, 使用的是网络地址端口转换(NAPT), 它不仅改IP, 还修改TCP和UDP协议的端口号, 这样就能让内网中的设备共用同一个外网IP.
举个例子, NAPT维护一个类似下表的NAT表:

即时通讯_第1张图片
2702646-cefd86afd8b99939.png
NAT设备会根据NAT表对出去和进来的数据做修改, 
比如将192.168.0.3:8888发出去的封包改成120.132.92.21:9202, 外部就认为他们是在和120.132.92.21:9202通信. 
同时NAT设备会将120.132.92.21:9202收到的封包的IP和端口改成192.168.0.3:8888, 再发给 内网的主机, 这样内部和外部就能双向通信了, 
但如果其中192.168.0.3:8888 == 120.132.92.21:9202
这一映射因为某些原因被NAT设备淘汰了, 
那么外部设备就无法直接与192.168.0.3:8888通信了。

而国内的运营商一般NAT超时的时间为5分钟,所以通常我们心跳设置的时间间隔为3-5分钟。

连接

你可能感兴趣的:(即时通讯)