基础协议
因为移动设备多变的网络环境,以及即时通讯应用实时在线的需求,简单地使用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。
用户模块,好友模块比较简单,无外就是增删查改。
值得一提的是消息模块,我将整个系统的各种功能事件,抽象成为"消息事件“, 比如,添加好友是一条消息,确认添加好友也是一条消息, 发送文本是一条文本消息,发送图文是图文消息。服务端只负责将该消息转发给指定客户端,而不关注消息是什么类型。而客户端接收到消息并根据消息类型进行其他逻辑操作。其他细节谈起来就没完没了了,附赠2张时序图。
发送文本消息时序图&添加好友时序图
客户端实现
Android端的实现近期流行的各种Android技术,RxJava,EventBus,MVP,信贸通即时通讯可以快速二次开发而且有免费集成接口,没啥技术难点。
Q Q:2533950058
有疑问加站长微信联系(非本文作者)