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源碼