基础协议
因为移动设备多变的网络环境,以及即时通讯应用实时在线的需求,简单地使用Scoket建立客户端与服务端,或者客户端与客户端的通信是行不通的。
当前普遍的做法是在服务端与客户端之间建立一个长连接,客户端A将消息发送给服务端,服务端再将消息转发给客户端B。
而如何建立一个长连接实现客户端与服务端的通信,以及保证连接的质量与低耗电,低耗流量是一个难题。这里就要扯上XMPP,MQTT这两个协议。XMPP是PC时代的产物,其底层通讯的数据格式的XML,数据冗余性太高(约70%),比较耗流量,并且在复杂的移动网络环境下会遇到各种各样的问题。不过胜在拥有比较多的开发资料以及Openfire(底层是基于XMPP)这样一个成熟的即时聊天框架。
MQTT协议较之XMPP更为轻量级,其连接的建立与传输的开销都非常小,非常精简,非常适合大量节点在弱网络环境的场景,发布/订阅的模式也比较易于扩展。 很明显, 我们需要选择MQTT协议作为我们这个即时通信应用的基础协议,关于MQTT客户端与服务端的开源实现有: fusesource/mqtt-client dobermai/android-mqtt-push mqttjs/MQTT.js
服务端实现
整个服务端实现比较简单,因为整个项目采用重客户端-轻服务端的开发策略,所以服务端的逻辑非常少,总共就4张表,12个接口。使用Restful风格的API。用户模块,好友模块比较简单,无外就是增删查改。
值得一提的是消息模块,我将整个系统的各种功能事件,抽象成为"消息事件“, 比如,添加好友是一条消息,确认添加好友也是一条消息, 发送文本是一条文本消息,发送图文是图文消息。服务端只负责将该消息转发给指定客户端,而不关注消息是什么类型。而客户端接收到消息并根据消息类型进行其他逻辑操作。
最终的客户端实现
一套全面集成语音、视频、电话、即时消息和邮件功能,可安装于智能手机、电脑(PC/Mac)的软件客户端SparkleComm。它的即时消息功能用于用户与用户间的多媒体及文本消息沟通,劳格即时消息包含即时消息客户端及服务端,支持群聊、离线消息推送。它的特征包括:1.传送格式包括:图片、文件、表情、音频片段、视频片段等,实现桌面共享功能;2.支持SIP Message;3.同时支持手机客户端(Android/iOS/WM)以及PC客户端(Windows/macOS/Linux),并与软件电话集成。