ImCore 利用 webSocket 协议实现简易、高性能、集群即时通讯组件,支持点对点通讯、群聊通讯、上线下线事件消息等众多实用性功能。

Quick Start

dotnet add package ImCore

IM服务端

public void Configure(IApplicationBuilder app)
{app.UseimServer(new imServerOptions{Redis = new CSRedis.CSRedisClient("127.0.0.1:6379,poolsize=5"),Servers = new[] { "127.0.0.1:6001" }, //集群配置Server = "127.0.0.1:6001"});
}

一套永远不需要迭代更新的IM服务端

WebApi业务端

public void Configure(IApplicationBuilder app)
{//...ImHelper.Initialization(new ImClientOptions{Redis = new CSRedis.CSRedisClient("127.0.0.1:6379,poolsize=5"),Servers = new[] { "127.0.0.1:6001" }});ImHelper.EventBus(t => Console.WriteLine(t.clientId + "上线了"), t => Console.WriteLine(t.clientId + "下线了"));
}
ImHelper方法 参数 描述
PrevConnectServer (clientId, string) 在终端准备连接 webSocket 前调用
SendMessage (发送者, 接收者, 消息内容, 是否回执) 发送消息
GetClientListByOnline - 返回所有在线clientId
EventBus (上线委托, 离线委托) socket上线与下线事件
频道 参数 描述
JoinChan (clientId, 频道名) 加入
LeaveChan (clientId, 频道名) 离开
GetChanClientList (频道名) 获取频道所有clientId
GetChanList - 获取所有频道和在线人数
GetChanListByClientId (clientId) 获取用户参与的所有频道
GetChanOnline (频道名) 获取频道的在线人数
SendChanMessage (clientId, 频道名, 消息内容) 发送消息,所有在线的用户将收到消息
  • clientId 应该与 webApi 的用户id相同,或者有关联;
  • 频道适用临时的群聊需求,如:聊天室、即时讨论区;

Html5终端

前端连接 webSocket 前,应该先请求 webApi 获得授权过的地址(ImHelper.PrevConnectServer),伪代码:

ajax('/prev-connect-imserver', function(data) {var url = data; //此时的值:ws://127.0.0.1:6001/ws?token=xxxxxvar sock = new WebSocket(url);sock.onmessage = function (e) {//...};
})

Demo

运行环境:.NETCore 2.1 + redis-server 2.8

下载Redis-x64-2.8.2402.zip,点击 start.bat 运行;

cd imServer && dotnet run

cd web && dotnet run

打开多个浏览器,访问 http://127.0.0.1:5000 发送群消息

设计思路

终端(如浏览器) 使用 webSocket 连接 imServer;

imServer 根据 clientId 分区管理 webSocket 连接,可群集部署;

webApi 或其他应用端,使用 ImHelper 调用相关方法(如:SendMessage、群聊相关方法),将数据推至 Redis Channel;

imServer 订阅 Redis Channel,收到消息后向终端(如浏览器)推送消息;

1、可缓解并发推送消息过多的问题;

2、可解决连接数过多的问题;

3、解决业务和通讯分离,结构更加清淅;

imServer 充当消息转发,维护连接,代码万年不变不需要重启维护

webApi 负责所有业务

webSocket

如果浏览器使用 webSocket ,iOS 使用其他协议,协议不一致的后果很严重(难维护)。

建议所有端都使用 webSocket 协议,adorid/ios/h5/小程序 全部支持 webSocket 客户端。

业务通讯

IM 系统一般涉及【我的好友】、【我的群】、【历史消息】等等。。

那么,imServer与业务方(webApi)该保持何种关系呢?

用户A向好友B发送消息,分析一下:

  • 需要判断B是否为A好友;
  • 需要判断A是否有权限;
  • 等等。。

诸如此类业务判断会很复杂,如果使用imServer做业务协议,它是不是会变成巨无霸难以维护?

又如获取历史聊天记录,难道客户端要先webSocket.send('gethistory'),再在onmessage里定位回调处理?

发送消息

业务和推送分离的设计,即 imServer 只负责推送工作,webApi 负责业务。

用户A向B发消息:终端A ajax -> webApi -> imServer -> 终端B webSocket.onmessage;

获取历史消息:客户端请求业务方(webApi)接口,返回json(历史消息)。

背后采用 redis 轻量级的订阅发布功能,实现消息缓冲发送,方案必备之一,后期可更换为其他技术。比如 webApi 业务发需要通知1000个人,若不用消息缓冲,会对 webApi 应用程序整体将造成性能损耗。

还有使用 redis 存储一些数据,如在线 clientId,频道信息。

集群分区

单个 imServer 实例支持多少个客户端连接,两千个没问题?如果在线用户有10万人,怎么办???

部署 4 个 imServer:

imServer1 订阅 redisChanne1

imServer2 订阅 redisChanne2

imServer3 订阅 redisChanne3

imServer4 订阅 redisChanne4

业务方(webApi) 根据接收方的 clientId 后四位 16 进制与节点总数取模,定位到对应的 redisChannel,进行 redis->publish 操作将消息定位到相应的 imServer。

每个 imServer 管理着对应的终端连接,当接收到 redis 订阅消息后,向对应的终端连接推送数据。

事件消息

IM 系统比较常用的有上线、下线,在 imServer 层才能准确捕捉事件,但业务代码不合适在这上面编写了。

此时采用 redis 发布订阅技术,将上线、下线等事件向指定频道发布,业务方(webApi) 通过 ImHelper.EventBus 方法进行订阅捕捉。

A向B发文件的例子

1、A向 webapi 传文件

2、webapi 告诉 imServer,A向B正在传文件,ImHelper.SendMessage(B, "A正在给传送文件...")

3、B收到消息,A正在传文件

4、webapi 文件接收完成时告诉imServer,A向B文件传输完毕,ImHelper.SendMessage(B, "A文件传输完毕(含文件链接)")

5、B收到消息,A文件传输完毕(含文件链接)

有感而发

为什么说 signalr 不合适做 im?

im 的特点必定是长连接,轮训的功能用不上。

因为他是双工通讯的设计,用 hub.invoke 发送命令给服务端处理业务,其他就和 ajax 差不多,用来代替 ajax 减少 http 请求数量比较看好。

但是过多使用 hub,signalr 服务端会被业务入侵严重,业务变化频繁后不得不重新发布版本,每次部署所有终端都会断开连接,遇到5分钟发一次业务补丁的时候,类似离线和上线提示好友的功能就无法实现。

ImCore 的设计是业务和推送分离,即 imServer 永不更新重启,业务全部在 webApi 上编写,终端连接的是 imServer 就不会频繁重启的问题。

转载于:https://www.cnblogs.com/kellynic/p/11273742.html

[开源] .NETCore websocket 即时通讯组件---ImCore相关推荐

  1. 【IM开源推荐】前微信技术专家打造的开源的即时通讯组件OpenIM

    Open-IM是由前微信技术专家打造的***开源***的即时通讯组件.Open-IM包括IM服务端和客户端SDK,实现了高性能.轻量级.易扩展等重要特性.开发者通过集成Open-IM组件,并私有化部署 ...

  2. java SSM 框架 多数据源 代码生成器 websocket即时通讯 shiro redis 后台框架源码

    A 调用摄像头拍照,自定义裁剪编辑头像,头像图片色度调节 B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,快速开发利器)+快速表单构建器 freemaker模版技术 ,0个代码不用写,生 ...

  3. java代码编辑器 pdf文件预览 主流SSM 代码生成器 shrio redis websocket即时通讯

    获取[下载地址] QQ: 313596790 官网 http://www.fhadmin.org/ A 代码编辑器,在线模版编辑,仿开发工具编辑器,pdf在线预览,文件转换编码 B 集成代码生成器 [ ...

  4. 代码生成器 websocket即时通讯 shiro redis 后台框架源码

    获取[下载地址]   QQ: 313596790 A 调用摄像头拍照,自定义裁剪编辑头像,头像图片色度调节 B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,快速开发利器)+快速表单构建器 ...

  5. Riot-IM:是一个开源免费的即时通讯聊天协作工具,功能丰富且跨平台——Riot-IM

    Riot-IM 介绍  Riot-IM ,一个新型的协作平台,可以在 iOS.Android.Web 端运行,完全由自身控制的通用安全聊天应用程序.支持多大25种语言(支持中文),且还在不断地增加!可 ...

  6. php实现websocket即时通讯

    php实现websocket即时通讯 系统环境 环境配置 概述 websocket原理 php服务端 web客户端 开启Socket服务器程序 系统环境 centos 7 php5.6 环境配置 ph ...

  7. 使用tomcat方式实现websocket即时通讯服务端讲解

    使用tomcat方式实现websocket即时通讯服务端讲解 第一种方案:使用Tomcat的方式实现 tomcat版本要求:tomcat7.0+.需要支持Javaee7 导入javeee-api的ja ...

  8. 推荐:一款Java开源的Springboot 即时通讯 IM 聊天系统

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 # 开篇 电商平台最不能缺的就是即时通讯,例如通知类下发,客服聊天 ...

  9. 一款Java开源的SpringBoot即时通讯IM 聊天系统

    开篇 电商平台最不能缺的就是即时通讯,例如通知类下发,客服聊天等.今天,就来给大家分享一个开源的即时通讯系统.如对文章不感兴趣可直接跳至文章末尾,有获取源码链接的方法. 但文章内容是需要你简单的 过一 ...

最新文章

  1. mysql smack_super-smack测试mysql性能
  2. 程序员四大焦虑瞬间:拿什么拯救你,我日益后退的发际线?
  3. 全球无人车头部三强格局明确,百度自动驾驶估值400亿美金
  4. 网络推广是什么浅析网站内的链接优化技巧有哪些?
  5. linux系统中定时器使用方法,Linux下实现定时器Timer的几种方法
  6. 【数据竞赛】竞赛宝典黑科技:基于开源结果的高端融合策略
  7. android 获取Service(服务)的运行状态
  8. HarmonyOS之AI能力·文档检测校正
  9. linux检测hashicorp,在Ubuntu/CentOS/Debian上安装和配置Hashicorp Vault服务器的方法
  10. Sklearn参数详解--决策树
  11. 【.NET Core 跨平台 GUI 开发】第三篇:Gtk# 表格布局与事件处理
  12. 2021百度营销通案
  13. 缺陷管理规范--bug管理流程
  14. google浏览器不能登录
  15. spring 容器的 profile 功能
  16. html怎么把字转换为行内元素,什么是行内元素?
  17. 苹果CMSv10自适应短视频原创挖片网高端手机+电脑模板
  18. 通讯录_你有多久没翻过通讯录了?
  19. vue中的数据可视化(echarts)和highcharts
  20. 方程检验格式图片_eviews的异方差检验ppt课件

热门文章

  1. 【机器学习入门到精通系列】正则化解决过拟合问题(附Iris-L1 正则化代码)
  2. android 连接mysql orm_Android ORM框架 GreenDao 的使用详解
  3. 怎样获取网站的域名_深入挖掘同行,厉害的人是怎样做的?
  4. postgresql存储过程输出参数
  5. 网络营销——网络营销专员到底是教你如何选择网站页面制作
  6. 网络营销外包——网络营销外包专员如何提升首页关键词的转化率
  7. 如何提高营销型网站与搜索引擎之间的信任度?
  8. 如何在网站建设时正确设置符合SEO优化的元素?
  9. Android 手写Binder 教你理解android中的进程间通信
  10. 开发日记-20190719 关键词 读书笔记《Linux 系统管理技术手册(第二版)》DAY 12