即时通讯(im)框架/系统开发思考(1)-通讯协议选型

简介: 文章分析了XMPP,MQTT,WebSocket,socket.io 各种协议的优缺点,最终选择了socket.io 作为即时通讯的通讯手段。

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?

  1. socket.io设计的目标是支持任何的浏览器,任何设备。在接口方面,socket.io统一了通信的API,在内部实现上支持WebSocket,AJAX long-polling, AJAX multipart streaming, Forever Iframe等方式。也就是说,Socket.io会根据环境来选择适合的通信方式。
  2. socket.io 支持namespace, room 等概念,可以很方便的对socket 进行分组。
  3. 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源码

目录
相关文章
|
1月前
|
移动开发 网络协议 Java
即时通讯技术文集(第38期):IM代码入门实践(Part2) [共15篇]
为了更好地分类阅读 52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第38 期。
46 1
|
1月前
|
存储 数据挖掘 API
解码客服工单系统:选型指南让您信手拈来
在选择客服工单系统时,企业应明确需求,考虑功能(如工单管理、知识库集成、自动化流程)、易用性、技术支持、可扩展性、安全性和合规性。ZohoDesk提供定制服务,满足企业效率提升和成本降低的需求。进行成本效益分析以确保投资回报。
132 6
|
1月前
|
Java API 开发工具
开源即时通讯IM框架 MobileIMSDK v6.5 发布
本次更新为次要版本更新,进行了bug修复和优化升级(更新历史详见:码云 Release Notes、Github Release Notes)。 MobileIMSDK 可能是市面上唯一同时支持 UDP+TCP+WebSocket 三种协议的同类开源IM框架。轻量级、高度提炼,历经10年、久经考验。客户端支持iOS、Android、Java、H5、微信小程序、Uniapp,服务端基于Netty。
84 2
|
1月前
|
安全 Java 数据库
即时通讯技术文集(第37期):IM代码入门实践(Part1) [共16篇]
为了更好地分类阅读 52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第37 期。
35 2
|
1月前
|
安全 开发者 Docker
总结反思 持续进步-开源即时通讯(IM)项目OpenIM 新版本release-v3.7发布
背景 过去,我们团队对开源项目的认知较浅,过分追求进度,而忽视了代码的质量和规范。这导致了一些问题,例如部署流程设计不当:流程复杂、不规范,以及Mac与Windows部署的明显缺陷。这些问题不仅给开发者带来了困扰,也增加了社区维护的难度。 针对这些挑战,我们团队进行了深刻的反思并总结出了相关问题。目前,我们正在专注于提高代码质量和规范化工作,并在完善我们的开源贡献流程,以吸引更多贡献者参与。我们相信这是关键步骤,以扩大社区的影响力并将OpenIM发展成为一流的开源项目。 为此,我们已规划推出release-v3.7版本,该版本将全面改造部署、规范和流程等方面,并且与3.6版本数据完全兼容。
67 0
|
1月前
|
存储 Java 应用服务中间件
即时通讯技术文集(第36期):《跟着源码学IM》系列专题 [共12篇]
为了更好地分类阅读 52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第36期。
33 0
|
1月前
|
缓存 架构师
即时通讯技术文集(第35期):IM群聊技术合集(Part2) [共12篇]
为了更好地分类阅读 52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第35 期。
46 1
|
1月前
|
移动开发 网络协议 小程序
基于开源IM即时通讯框架MobileIMSDK:RainbowChat-iOS端v9.0版已发布
MobileIMSDK 是一套专门为移动端开发的开源IM即时通讯框架,超轻量级、高度提炼,一套API优雅支持 UDP 、TCP 、WebSocket 三种协议,支持 iOS、Android、H5、标准Java、小程序、Uniapp,服务端基于Netty编写。
66 0
|
1月前
|
前端开发 Java 开发工具
推荐:一款Java开源的Springboot 即时通讯 IM 聊天系统
推荐:一款Java开源的Springboot 即时通讯 IM 聊天系统
221 0

热门文章

最新文章