一、前言

大多数系统里面好像都有获取消息的功能,但这些消息来源都不是实时的,比如你开两个浏览器,用两个不同的账号登录,用一个账号给另外一个账号发送消息,然而并不会实时收到消息,必须要自己手动F5刷新一下页面才会显示自己的消息,这样感觉用户体验不太好。之前看了Learning hard关于Signalr的文章,刚好自己项目中有用到获取实时消息的功能,然而我们项目中就是用js代码setinterval方法进行1秒刷新读取数据的,这样严重给服务器端添加负担,影响系统性能!所以自己稍微研究了一下,下面是自己的一些理解,如果有不对的地方,请大家加以斧正!

二、实现原理

下面谈一下自己对Signalr的理解,Signalr可以进行远程分布式实时通信,都是使用远程代理来实现,其中有两大内部对象,第一个是Persisten Connection,用于客户端和服务器端的持久连接,第二个是Hub(集线器)对象,主要用于信息交互,将服务器端的数据推送(push)至客户端,大致原理如下:

1、客户端建立与服务器端的连接

2、客户端调用服务器端的方法

3、服务器端通过客户端发送的请求,响应数据,再将数据推送至客户端

三、Signalr实现消息推送

具体操作实现如下:

1、创建一个应用程序,我这里创建的是MVC应用程序

2、引用相关组件,右键引用》选择管理Nuget程序包

3、搜索Signalr,如图所示:

点击安装,在应用程序的Scripts文件夹里面会自动生成两个js文件,如图所示:

4、添加集成器类

5、注册signalr/hubs,在Startup.cs里面添加如下代码

6、新建控制器MessageController,然后在控制器里面新建两个视图方法SendMessage和ReceiveMessage,为了让效果看起来更直观,一个页面用于发送消息,一个页面用于接收消息,如图所示:

7、在我们刚刚新建的集成器类MyHub类里面添加代码:

(特别说明一下,这里的InsertMsg方法主要是将客户端发送的消息信息保存到数据库里面,便于消息读取,为了快速创建数据库表,我采用的code first方法来创建的,至于你想用什么方式创建表,那都是可以的。)

  1. namespace Signalr.Models
  2. {
  3. [HubName("MyHub")]
  4. public class MyHub : Hub
  5. {
  6. MessageDbContext _db = new MessageDbContext();
  7. public void Send(string title, string message)
  8. {
  9. this.InsertMsg(title, message);
  10. // 调用所有客户端的sendMessage方法
  11. Clients.All.sendMessage(message);
  12. }
  13.  
  14. private void InsertMsg(string title, string message)
  15. {
  16. Message msg = new Message();
  17. msg.Title = title;
  18. msg.MsgContent = message;
  19. _db.Messages.Add(msg);
  20. _db.SaveChanges();
  21. }
  22. }
  23. }

表结构如图所示:

8、控制器MessageController后台代码

  1. public class MessageController : Controller
  2. {
  3. private MessageDbContext _db = new MessageDbContext();
  4. public ActionResult SendMessage()
  5. {
  6. return View();
  7. }
  8.  
  9. public ActionResult ReceiveMessage()
  10. {
  11. return View();
  12. }
  13.  
  14. [HttpPost]
  15. public JsonResult MsgCount()
  16. {
  17. var count = this._db.Messages.Where(p=>p.IsRead==).Count();
  18. return Json(new {count=count},JsonRequestBehavior.AllowGet);
  19. }
  20. }

9、前端页面代码(SendMessage.cshtml)

  1. @{
  2. ViewBag.Title = "发送消息";
  3. }
  4. <title>发送消息</title>
  5. <script src="~/Scripts/jquery-1.10.2.js"></script>
  6. <script src="~/Scripts/jquery.signalR-2.2.0.min.js"></script>
  7. <script src="~/signalr/hubs"></script>
  8. <script type="text/javascript">
  9. $(function () {
  10. // 引用自动生成的集线器代理
  11. var chat = $.connection.MyHub;
  12. // 定义服务器端调用的客户端sendMessage来显示新消息
  13. chat.client.sendMessage = function (title, message) {
  14. // 向页面发送接收的消息
  15. sendMsg();
  16. };
  17. // 集成器连接开始
  18. $.connection.hub.start().done(function () {
  19. sendMsg();
  20. // 服务连接完成,给发送按钮注册单击事件
  21. $('#sendmessage').click(function () {
  22. // 调用服务器端集线器的Send方法
  23. chat.server.send($("#title").val(), $('#message').val());
  24. });
  25. });
  26. });
  27.  
  28. function sendMsg() {
  29. var options = {
  30. url: '/Message/MsgCount',
  31. type: 'post',
  32. success: function (data) {
  33. $("#count").html(data.count);
  34. }
  35. };
  36. $.ajax(options);
  37. }
  38. </script>
  39.  
  40. <h2>
  41. 发送消息
  42. </h2>
  43. <div>
  44. <label>我的消息:</label>
  45. <span style=" color:red; font-size:30px;" id="count"></span>条
  46. </div>
  47. <p>
  48. <div>
  49. 标题:
  50. <input type="text" id="title" />
  51. </div>
  52. <br /><br />
  53. <div>
  54. 内容:
  55. <textarea id="message" rows="" cols=""></textarea>
  56. </div>
  57. <br /><br />
  58. <div>
  59. <input type="button" id="sendmessage" value="发送" />
  60. </div>
  61. </p>

10、前端页面代码(ReceiveMessage.cshtml)

  1. @{
  2. ViewBag.Title = "接受消息";
  3. }
  4. <title>接受消息</title>
  5. <script src="~/Scripts/jquery-1.10.2.js"></script>
  6. <script src="~/Scripts/jquery.signalR-2.2.0.min.js"></script>
  7. <script src="~/signalr/hubs"></script>
  8. <script type="text/javascript">
  9. $(function () {
  10. // 引用自动生成的集线器代理
  11. var chat = $.connection.MyHub;
  12. // 定义服务器端调用的客户端sendMessage来显示新消息
  13. chat.client.sendMessage = function (title, message) {
  14. // 向页面发送接收的消息
  15. MsgCount();
  16. var html = "<div>标题:" + title + "消息内容:" + message + "</div>";
  17. $("#msgcontent").after(html);
  18. };
  19. // 集成器连接开始
  20. $.connection.hub.start().done(function () {
  21. MsgCount();
  22. });
  23. });
  24. function MsgCount() {
  25. var options = {
  26. url: '/Message/MsgCount',
  27. type: 'post',
  28. async:false,
  29. data: { title: $("#title").val(), msgcontent: $("#sendmessage").val() },
  30. success: function (data) {
  31. $("#count").html(data.count);
  32. }
  33. };
  34. $.ajax(options);
  35. }
  36. </script>
  37.  
  38. <h2>
  39. 接收消息
  40. </h2>
  41.  
  42. <div>
  43. <label>我的消息:</label>
  44. <span style=" color: red; font-size: 30px; margin-right:10px;" id="count"></span>条
  45. <br />
  46. <br />
  47. <div id="msgcontent"></div>
  48. </div>

好了,大功告成,可能你有点疑问的是这个js文件引用地方在哪里

不防我们运行页面,按F12查看一下,它会自动在这里生成一个js文件,我们只要在页面中引用这个路径即可

四、页面效果(见证奇迹的时刻到了,哈哈哈~~~)

为了让页面效果更为直观,我这里用IE打开SendMessage.cshtml页面,用Google打开ReceiveMessage.cshtml页面。

权责申明

作者:SportSky 出处: http://www.cnblogs.com/sportsky/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。如果觉得还有帮助的话,可以点一下右下角的【推荐】,希望能够持续的为大家带来好的技术文章!想跟我一起进步么?那就【关注】我吧

Signalr实现消息推送的更多相关文章

  1. 基于SignalR的消息推送与二维码描登录实现

    1 概要说明 使用微信扫描登录相信大家都不会陌生吧,二维码与手机结合产生了不同应用场景,基于二维码的应用更是比较广泛.为了满足ios.android客户端与web短信平台的结合,特开发了基于Singl ...

  2. AngularJS+ASP.NET MVC+SignalR实现消息推送

    原文:AngularJS+ASP.NET MVC+SignalR实现消息推送 背景 OA管理系统中,员工提交申请单,消息实时通知到相关人员及时进行审批,审批之后将结果推送给用户. 技术选择 最开始发现 ...

  3. SignalR实现消息推送,包括私聊、群聊、在线所有人接收消息(源码)

    一.关于SignalR 1.简介:Signal 是微软支持的一个运行在 Dot NET 平台上的 html websocket 框架.它出现的主要目的是实现服务器主动推送(Push)消息到客户端页面, ...

  4. .netcore signalR 实时消息推送

    服务器端引入包 Install-Package Microsoft.AspNetCore.SignalR客户端引入包  npm install @aspnet/signalr <template ...

  5. WebForm SignalR 实时消息推送

    原文:https://www.jianshu.com/p/ae25d0d77011 官方文档:https://docs.microsoft.com/zh-cn/aspnet/signalr/ 实现效果 ...

  6. SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=》提升)

     SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=>提升,5个Demo贯彻全篇,感兴趣的玩才是真的学) 官方demo:http://www.asp.net/si ...

  7. C# BS消息推送 SignalR介绍(一)

    1. 前言 本文是根据网上前人的总结得出的. 环境: SignalR2.x,VS2015,Win10 介绍 1)SignalR能用来持久客户端与服务端的连接,让我们便于开发一些实时的应用,例如聊天室在 ...

  8. C# BS消息推送 SignalR Hubs环境搭建与开发(二)

    1. 前言 本文是根据网上前人的总结得出的. 环境: SignalR2.x,VS2015,Win10 2. 开始开发 1)新建一个MVC项目,叫做SignalRDemo 2)安装SignalR包 In ...

  9. Asp.net SignalR 实现服务端消息推送到Web端

              之前的文章介绍过Asp.net SignalR,  ASP .NET SignalR是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信.  今天我 ...

随机推荐

  1. JAVA设计模式——代理(动态代理)

    传送门:JAVA设计模式——代理(静态代理) 序言: 在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring ...

  2. Docker Data Center系列(三)- DTR安装指南

    本系列文章演示如何搭建一个mini的云平台和DevOps实践环境. 基于这套实践环境,可以部署微服务架构的应用栈,演练提升DevOps实践能力. 1 系统要求 1.1 硬件和软件要求 成为UCP管理的 ...

  3. 简易付弹窗问题FAQ

    情景:按返回键后,使用快捷键弹到数据统计页面. 适用门店类型:单纯收银. 解决方案:操作步骤下                        1.       系统修复-更多-快捷键设置 . 2.   ...

  4. 如何进行Apache虚拟机设置

    摘要:虚拟机Apache设置很多用户都遇到过,具体如何进行虚拟机Apache设置?怎样才能让虚拟机Apache设置达到最简单,最优化?本文为您讲解. Apache虚拟机设置有两种方法: 基于主机名的虚 ...

  5. 2802:小游戏利用bfs来实现

    之前使用的是递归的方法来解决的问题,后来有点想用bfs(宽度优先搜索来尝试一下的想法,在网上看到有人使用了dfs(深度优先搜索)更加坚定了自己的这种想法. 这个方法首先是以顶点的四组开始,加入那些没有 ...

  6. LeetCode算法题-Binary Tree Level Order Traversal II(Java实现)

    这是悦乐书的第165次更新,第167篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第24题(顺位题号是107).给定二叉树,返回其节点值的自下而上级别顺序遍历(即从左到右 ...

  7. June 17. 2018, Week 25th. Sunday

    Dad is and always will be my living, breathing superhero. 在我眼里,爸爸是现实版的超级英雄,现在.将来,永远都是. From Bindi Ir ...

  8. Spring的AOP开发的相关术语

    转载自 https://www.cnblogs.com/ltfxy/p/9873618.html SpringAOP简介: AOP思想最早是由AOP联盟组织提出的.Spring使用这种思想最好的框架. ...

  9. javascript:针对yyyy-MM-dd hh:mm:ss格式的毫秒转换.

    javascript:针对yyyy-MM-dd hh:mm:ss格式的毫秒转换. 时间 2015-11-07 22:18:39  HideHai's blog 原文  http://www.hideh ...

  10. 获取当前页面的URL信息

    以前在做网站的时候,经常会遇到当前页的分类高亮显示,以便让用户了解当前处于哪个页面.之前一直是在每个不同页面写方法.工程量大,也不便于修改.一直在想有什么简便的方法实现.后来在网上查到可以用获取当前U ...