一、SignalR使用心得
一、通讯模式
以往,我们聊天发消息模式(单体发送消息或通知)-好友(一对一)、群组(一对多),方便管理好友-分组方式。
那么聊天和好友管理参考qq,刷新分组标签也页面就会从新加载分组列表和分组内好友列表,
刷新群组标签页面就会从新加载群组列表,点击好友进行聊天从新数据库里面从新获取消息(包含已读和未读、历史记录、其实就是读取最新的消息-没有已读和未读之说)。
请求无状态,我们不知道有没有发送消息,我们就需要实时的监听有没有新消息,以往的ajax轮询,如今的signalr。
二、SignalR的实时模式
用户通过signalr连接服务器后将会是一种实时的连接,并且保存用户标识,那么我们就能实时提醒我们是否有新消息和监测用户是否发送消息。
具体为:
文字说明:1、前端在(指定位置)执行连接signalr会触发OnConnectedAsync (客户端连接函数,并保存ConnectionId客户端标识)。
代码说明:
/// <summary> /// 客户端连接的时候调用 /// </summary> /// <returns></returns> public override Task OnConnectedAsync() { var id = this.Context.ConnectionId;//客户标识 Trace.WriteLine("客户端连接成功"); return base.OnConnectedAsync(); }//所有链接的客户端都会在这里
signalr有发送消息机制让我触发即知道我要发消息,即signalr封装调用前端的发消息的函数,直接以此为载体将数据发送到服务器上,即触发服务器内的消息函数。
设想1:
如果没有此机制(机制必须让服务器端知道某用户有消息),仅连接不知道用户做什么,将完全没有任何意义。
如果通知你有消息,还去数据库读取也将会多此一举即(用户发消息触发机制服务器仅知道有消息,无内容即代码可为消息机制函数内写ajax达到触发服务端有消息过来内容没传,内部ajax触发自己写的控制器方法存储消息到数据库),然后前端有一个signalr有消息通知机制可以抖动效果,你自己再去读取的这种形式,达到消息体和实时连接完全隔离,消息体的格式很多种、支持文字、图片、视频、gif、等等还要根据链接各个端支持的资源格式做处理(多个浏览器支持的资源格式例如苹果浏览器的视频资源和google视频资源),这里实时连接兼容问题-每个浏览器支持的实时连接已经工作量不小。
而signar发送消息触发机制是可以承载消息体资源的,这里官方可能没刻意提到的它的细节,毕竟浏览器都支持,我还支持不了你的消息资源格式吗,肯定不能呀。
设想2:ConnectionId去绑定用户昵称和头像反之。这里的ConnectionId是继承Hub类的,在此类都可以访问,
ConnectionId去绑定用户昵称和头像:
通过触发OnConnectedAsync,只要链接的第一时间从数据库获取,并绑定,同时因为ConnectionId一直服务端内的持久存在,绑定的关系,也要持久化在服务端用static或缓存。
用户昵称和头像去绑定ConnectionId:
通过自定义函数,链接后,主动触发,将用户名和头像传到hub内的自定义函数内,获取并绑定,雷同图下。
三、处理消息的方式
好友列表和消息列表2种情况
已知道:能获取所有客户端的链接(这个链接会非常大,多少亿人的链接,但是自己账户的人确实很少),
1、所以一个用户刚登陆的情况:
就要读取数据库该用户所有好友,将链接的所有客户端有该用户好友的全部点亮。
2、分组也是如上一样
3、消息的话情况
3、1 一方在线的情况下 通过客户端发送到我们的Signalr中转服务中,我们先存储数据库设置未读,在线则推送,否则取消
3、2 上线的情况 客户 但是 用户先读取用户列表点亮,然后才有消息之说,
判断是否有未读消息,有就从数据库读取消息并将消息状态更改已读。
,然后 根据用户是否在线,反推送消息读取成功的id——表示展示效果已读。 (需要消息知道是否被读的情况下,执行该操作)
3、消息记录也是,直接获取消息记录,(需要消息知道是否被读的情况下,执行该操作将消息读取状态也获取)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架