1.前言:
近来笔者接到公司的一个IM开发需要,要在原来的Web业务系统、移动端系统上加入一个即时聊天的功能,具有就是能聊天就行。相信各位也会接到需要开发IM的系统的任务,那么,开发一个im系统应选用哪种通讯协议?
2.思考-即时聊天选用的通讯协议选哪种:
XMPP(可扩展消息与存在协议): 是一个成熟开源的即时聊天协议, 基于XMPP的开源技术有openfire(后台端), spark(客户端)
优势: 比较成熟的聊天协议,已在XMPP协议内支持单聊, 群聊, 加好友等功能.满足基本的需要.
缺点: 基于xml 实现的通讯协议, 消息载体比较重, 增加网络流量, 定制困难,需要了解openfire原理, 改造有一定的难度。
跨平台: 一般, 仅基于java平台, 如要实现web 等需要自己使用socket进行xml封装.
MQTT(消息队列遥测传输): 严格来说, MQTT是使用与物联网领域的消息传输协议,但有一些即时通讯系统也使用这个协议进行拓展开发,故拎出来说说。MQTT主要有三个特点: 1. 基于发布订阅模式; 2. 为网络不可靠的环境下提供一套消息重传协议.3. 基于TCP/IP, 消息载体轻, 耗电量小.
优势: 已实现消息丢失重传功能, 消息载体轻, 耗电量小.
缺点: 不是专用于聊天的协议, 登录, 单聊, 群聊, 加好友等功能都需要自己实现. 开发成本高,如要支持多个平台, 每个客户端都需要定制,IM方面的开源社区不活跃,技术文档少。
跨平台: 差, 每个客户端都需要实现MQTT的聊天协议。
自定义协议: 可以基于WebSocket, socket.io, 甚至常用的消息队列: RabbitMQ, RocketMQ 等长连接框架上加入聊天的业务, 比如登录, 单聊, 群聊, 加好友等功能。
优势: 基于自己熟悉的技术栈,易上手。
缺点: 单聊, 群聊, 加好友等功能都需要自己实现。
跨平台: 一般, 若选用广泛使用于客户端的WebSocket, socket.io,能很好的实现跨平台性。
考虑到日后的跨平台定制开发,最终敲定选用socket.io + 自定义协议实现。为什么要选用socket.io?不用WebSocket?
- socket.io设计的目标是支持任何的浏览器,任何设备。在接口方面,socket.io统一了通信的API,在内部实现上支持WebSocket,AJAX long-polling, AJAX multipart streaming, Forever Iframe等方式。也就是说,Socket.io会根据环境来选择适合的通信方式。
- socket.io 支持namespace, room 等概念,可以很方便的对socket 进行分组。
- socket.io 具有自动重连的功能,适用于恶劣的网络环境。
而e聊sdk正是基于socket.io上开发的免费开源即时通讯框架,e聊sdk 已实现了多平台的socket.io 支持(如:Web, ReactNative, 微信小程序等), 阅读e聊客户端核心sdk 的源码中, 可见到在socket.ts 文件中已实现了多平台的socket.io 支持:
/*IFTRUE_WEBAPP*/
const webio = require('socket.io-client');
this。socket = webio。connect(url+"");
/*FITRUE_WEBAPP*/
/*IFTRUE_RNAPP*/
const rnio = require('socket.io-client');
this。socket = rnio。connect(url+"", {transports: ['websocket']});
/*FITRUE_RNAPP*/
/*IFTRUE_WXAPP*/
const wxio = require('weapp.socket.io');
this。socket = wxio。connect(url+"");
/*FITRUE_WXAPP*/
正是由于e聊sdk在设计之初已具有良好的跨平台支持, 选择使用e聊开发即时通讯,可以在跨平台上实现事半功倍的效果。
参考:
e聊客户端核心sdk源码