一、通讯模式

以往,我们聊天发消息模式(单体发送消息或通知)-好友(一对一)、群组(一对多),方便管理好友-分组方式。

那么聊天和好友管理参考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、消息记录也是,直接获取消息记录,(需要消息知道是否被读的情况下,执行该操作将消息读取状态也获取)

最新文章

  1. html background 背景颜色美化 类似毛玻璃
  2. mactype支持qq浏览器
  3. Fast RCNN 训练自己数据集 (1编译配置)
  4. 【Android多屏适配】动态改变Listview item高度
  5. 【转】Mac用户必备!100多款免费实用的苹果Mac软件大搜集
  6. U3D 内置对象
  7. Beautiful Numbers
  8. 动态SQL使用绑定变量
  9. 一周学会Mootools 1.4中文教程:序论
  10. java--函数练习
  11. MySQLdb 部署
  12. python 实现简单卷积网络框架
  13. openssl链接动态库的方法
  14. 通用漏洞评估方法CVSS 3.0 计算公式及说明
  15. 福州大学第十五届程序设计竞赛_重现赛B题迷宫寻宝
  16. nexus maven私服搭建
  17. Tomcat的overview界面浅析
  18. 理解 on-policy 和 off-policy
  19. 虚拟机中的Linux安装VMware Tools的方法
  20. MySQL的空值和NULL区别

热门文章

  1. 14 补充 MySQL的创建用户和授权
  2. mysql 数据增删改的总结
  3. python之正则匹配match:search findall
  4. jQuery.parseJSON()
  5. Linux内核中的cmpxchg函数
  6. 五、python中MD5加密
  7. 为什么我上传了flv或MP4文件到服务器,可输入正确地址通过http协议来访问总是出现“无法找到该页”的404错误呢
  8. 测开之路一百二十七:flask之构造response对象
  9. gitlab+jenkins 搭建
  10. 【Linux 应用编程】基础知识