《移动IM开发指南》系列文章将会介绍一个IM APP的方方面面,包括技术选型、登录优化等。此外,本文做者会结合他在网易云信多年 iOS IM SDK 开发的经验,深度分析实际开发中的各类常见问题。git
### 通信方式选择github
IM通信方式无非两种选择:设备直连(P2P)和经过服务器中转。算法
一、 P2P
P2P 多见于局域网内聊天工具,典型的应用有:飞鸽传书等。这类软件在启动后通常作两件事情:安全
详细的流程能够参考飞鸽传书源码。可是这种方式在有种种限制和不便:一方面它只适合在线的点对点消息传输,对离线,群组等业务支持不够。另外一方面因为 NAT 的存在,使得不一样局域网内机器互联难度大大上升,在某些网络类型(对称 NAT)下没法创建链接。服务器
二、 服务器中转
几乎全部互联网IM产品都采用服务器中转这种方式进行消息传输,相对于P2P的方式,它有以下的优势:网络
固然它也有本身的问题:服务器架构复杂,并发要求高。架构
IM 主流网络链接方式有两种:并发
后者常见于 Web IM 系统(固然如今不少 Web IM 都是基于 WebSocket 实现),它的优势是实现简单,方便开发上手,问题是流量大,服务器负载较大,消息及时性没法很好地保证,对大规模的用户量支持不够,比较适合小型的 IM 系统,如小网站的客户系统。
基于 TCP 长链接则可以更好地支持大批量用户,问题是客户端和服务器的实现比较复杂。固然也还有一些变种,以下行使用 MQTT 进行服务器通知/消息的下发,上行使用 HTTP 短链接进行指令和消息的上传。这种方式可以保证下行消息/指令的及时性,可是在弱网络下上行慢的问题仍是比较严重。早期的来往就是基于这种方式。负载均衡
IM 协议选择原则通常是:易于拓展,方便覆盖各类业务逻辑,同时又比较节约流量。后一点的需求在移动端 IM 上尤为重要。
常见的协议有:XMPP;SIP;MQTT;私有协议。工具
可是缺点也是很多:XML 表现力弱,有太多冗余信息,流量大,实际使用时有大量天坑。
一个好的协议须要知足以下条件:高效,简洁,可读性好,节约流量,易于拓展,同时又可以匹配当前团队的技术堆栈。基于如上原则,咱们能够推出: 若是团队小,团队技术在 IM 上积累不够能够考虑使用 XMPP 或者 MQTT+HTTP 短链接的实现。反之能够考虑本身设计和实现私有协议。
一个最简单的包头能够定义为
以心跳包为例,假设当前的 serial 为 1,心跳包的 command 为 10,那么使用 MessagePack 作序列化时:length=4,serial=1,command=10,code=0,每一个字段各占一个字节,包体为空,仅须要 4 个字节。
固然这是最简单的一个例子,面对真正的业务逻辑时,包体里面会须要塞入更多地信息,这个须要开发根据本身的业务逻辑总结公共部分,如为了兼容加入的协议版本号,为了负载均衡加入的模块 id 等。
上面就是 IM 系统大体的选型过程,包含了通信方式,链接方式,协议选择,协议设计。可是实际开发过程当中还有大量的问题须要处理。《移动IM开发指南》系列文章第二篇将会为你们解答实际开发中的常见问题。
随着即时通信以及音频处理和压缩技术的不断发展,效果更好、适用范围更广、性能更高的算法和新的技术必将不断涌现,若是你有好的技术或者分享,欢迎关注网易云信官方博客和 GitHub:
关注更多技术干货内容: 网易云信博客
欢迎关注 网易云信 GitHub
欢迎关注 网易云信官网