一、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、消息记录也是,直接获取消息记录,(需要消息知道是否被读的情况下,执行该操作将消息读取状态也获取)
最新文章
- html background 背景颜色美化 类似毛玻璃
- mactype支持qq浏览器
- Fast RCNN 训练自己数据集 (1编译配置)
- 【Android多屏适配】动态改变Listview item高度
- 【转】Mac用户必备!100多款免费实用的苹果Mac软件大搜集
- U3D 内置对象
- Beautiful Numbers
- 动态SQL使用绑定变量
- 一周学会Mootools 1.4中文教程:序论
- java--函数练习
- MySQLdb 部署
- python 实现简单卷积网络框架
- openssl链接动态库的方法
- 通用漏洞评估方法CVSS 3.0 计算公式及说明
- 福州大学第十五届程序设计竞赛_重现赛B题迷宫寻宝
- nexus maven私服搭建
- Tomcat的overview界面浅析
- 理解 on-policy 和 off-policy
- 虚拟机中的Linux安装VMware Tools的方法
- MySQL的空值和NULL区别