1.前言:
近來筆者接到公司的一個(gè)IM開發(fā)需要,要在原來的Web業(yè)務(wù)系統(tǒng)昔期、移動(dòng)端系統(tǒng)上加入一個(gè)即時(shí)聊天的功能俐芯,具有就是能聊天就行。相信各位也會(huì)接到需要開發(fā)IM的系統(tǒng)的任務(wù),那么缓升,開發(fā)一個(gè)im系統(tǒng)應(yīng)選用哪種通訊協(xié)議?
2.思考-即時(shí)聊天選用的通訊協(xié)議選哪種:
XMPP(可擴(kuò)展消息與存在協(xié)議): 是一個(gè)成熟開源的即時(shí)聊天協(xié)議, 基于XMPP的開源技術(shù)有openfire(后臺(tái)端), spark(客戶端)
優(yōu)勢: 比較成熟的聊天協(xié)議,已在XMPP協(xié)議內(nèi)支持單聊, 群聊, 加好友等功能.滿足基本的需要.
缺點(diǎn): 基于xml 實(shí)現(xiàn)的通訊協(xié)議, 消息載體比較重, 增加網(wǎng)絡(luò)流量, 定制困難鼓鲁,需要了解openfire原理, 改造有一定的難度。
跨平臺(tái): 一般, 僅基于java平臺(tái), 如要實(shí)現(xiàn)web 等需要自己使用socket進(jìn)行xml封裝.
MQTT(消息隊(duì)列遙測傳輸): 嚴(yán)格來說, MQTT是使用與物聯(lián)網(wǎng)領(lǐng)域的消息傳輸協(xié)議港谊,但有一些即時(shí)通訊系統(tǒng)也使用這個(gè)協(xié)議進(jìn)行拓展開發(fā)骇吭,故拎出來說說。MQTT主要有三個(gè)特點(diǎn): 1. 基于發(fā)布訂閱模式; 2. 為網(wǎng)絡(luò)不可靠的環(huán)境下提供一套消息重傳協(xié)議.3. 基于TCP/IP, 消息載體輕, 耗電量小.
優(yōu)勢: 已實(shí)現(xiàn)消息丟失重傳功能, 消息載體輕, 耗電量小.
缺點(diǎn): 不是專用于聊天的協(xié)議, 登錄, 單聊, 群聊, 加好友等功能都需要自己實(shí)現(xiàn). 開發(fā)成本高歧寺,如要支持多個(gè)平臺(tái), 每個(gè)客戶端都需要定制燥狰,IM方面的開源社區(qū)不活躍奖唯,技術(shù)文檔少板惑。
跨平臺(tái): 差, 每個(gè)客戶端都需要實(shí)現(xiàn)MQTT的聊天協(xié)議。
自定義協(xié)議: 可以基于WebSocket刘莹, socket.io顷链, 甚至常用的消息隊(duì)列: RabbitMQ目代, RocketMQ 等長連接框架上加入聊天的業(yè)務(wù), 比如登錄嗤练, 單聊榛了, 群聊, 加好友等功能煞抬。
優(yōu)勢: 基于自己熟悉的技術(shù)棧霜大,易上手。
缺點(diǎn): 單聊革答, 群聊战坤, 加好友等功能都需要自己實(shí)現(xiàn)。
跨平臺(tái): 一般残拐, 若選用廣泛使用于客戶端的WebSocket途茫, socket.io,能很好的實(shí)現(xiàn)跨平臺(tái)性蹦骑。
考慮到日后的跨平臺(tái)定制開發(fā)慈省,最終敲定選用socket.io + 自定義協(xié)議實(shí)現(xiàn)。為什么要選用socket.io眠菇?不用WebSocket边败?
- socket.io設(shè)計(jì)的目標(biāo)是支持任何的瀏覽器,任何設(shè)備捎废。在接口方面笑窜,socket.io統(tǒng)一了通信的API,在內(nèi)部實(shí)現(xiàn)上支持WebSocket登疗,AJAX long-polling排截, AJAX multipart streaming嫌蚤, Forever Iframe等方式。也就是說断傲,Socket.io會(huì)根據(jù)環(huán)境來選擇適合的通信方式脱吱。
- socket.io 支持namespace, room 等概念,可以很方便的對socket 進(jìn)行分組认罩。
- socket.io 具有自動(dòng)重連的功能箱蝠,適用于惡劣的網(wǎng)絡(luò)環(huán)境。
而e聊sdk正是基于socket.io上開發(fā)的免費(fèi)開源即時(shí)通訊框架垦垂,e聊sdk 已實(shí)現(xiàn)了多平臺(tái)的socket.io 支持(如:Web宦搬, ReactNative, 微信小程序等)劫拗, 閱讀e聊客戶端核心sdk 的源碼中间校, 可見到在socket.ts 文件中已實(shí)現(xiàn)了多平臺(tái)的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在設(shè)計(jì)之初已具有良好的跨平臺(tái)支持欲逃, 選擇使用e聊開發(fā)即時(shí)通訊,可以在跨平臺(tái)上實(shí)現(xiàn)事半功倍的效果饼暑。
參考:
e聊客戶端核心sdk源碼