什么是SignalR?
ASP.NET SignalR 是为.NET 开发者提供即时通讯Web 应用的类库。即时通讯Web服务就是服务器将内容自动推送到已经连接的客户端,而不是服务器等待客户端发起一个新的数据请求。
SignalR能够被运用到各种类型的即时响应应用。你完全可以运用SignalR实现一个在线即时聊天应用。当然SignalR也运用在用户需要随时更新数据的网页运用,比如仪表盘和监控运用,其他协同应用程序(文档协同操作)、工作流更新或者是即时表格。
SignalR 提供了使用JavaScript API 方法创建服务器对客户端的远程过程调用协议(RPC)的,它能够让你从客户端浏览器(或者其他平台)从.NET服务端发起远程调用。SignalR 同样提供了管理远程连接和连接组的API方法。
SignalR 不仅能够自动管理连接,而且能够同时向所有的客户端广播消息,就像聊天室一样。你也能够发送消息到指定的客户端。SignalR提供的连接是持久的,它不像传统的HTTP连接需要为每次收发消息建立单独的连接。
SignalR 同时在服务端提供了远程过程调用协议(RPC),让你能够“主动”推送消息到浏览器中的客户端,而不像普通的Web服务一样的应答方式。
ActiveMQ介绍
MQ是消息中间件,是一种在分布式系统中应用程序借以传递消息的媒介,常用的有ActiveMQ,RabbitMQ,kafka。ActiveMQ是Apache下的开源项目,完全支持JMS1.1和J2EE1.4规范的JMS Provider实现。
特点:
1、支持多种语言编写客户端
2、对MVC、WebFrom的支持,很容易和MVC、WebFrom整合
3、支持多种传输协议:TCP,SSL,NIO,UDP等
4、支持AJAX
消息形式:
1、点对点(queue)
2、一对多(topic)
实例项目工程简介
工程目录如下图:
Signalr.ActiveMQ:类库项目,包含消息生产者及消息消费者
ProcucerDome:控制台项目,模拟前置机发送消息
SignalRDome:asp.net web项目,模拟web客户端
一、建立asp.net web应用程序(SignalRDome)
第一步:打开一个SignalRDome项目文件
加入SignalR引用,在程序包管理控制台输入命令:Install-package Microsoft.Aspnet.Signalr
加入SignalR成功后的项目目录
第二步:加入ActiveMQ引用,在程序包管理控制台输入命令:Install-Package Apache.NMS.ActiveMQ
第三步:加入Signalr.ActiveMQ引用
第四步:在SignalRDome项目的根目录下建立SignalR文件夹,并在文件夹中建立客户端hub代理类(ChatHub)
using Microsoft.AspNet.SignalR;
using Microsoft.AspNet.SignalR.Hubs;
using SignalR.ActiveMQ;
using System.Threading.Tasks;
using System.Web;
namespace SignalRDome.SignalR
{
[HubName("chatHub")]
public class ChatHub : Hub
{
public void Send(string message,string call = "")
{
Procucer.GetInstance().Send(message,call);
}
public override Task OnConnected()
{
Customer.Clients = this.Clients;
return base.OnConnected();
}
public override Task OnDisconnected(bool stopCalled)
{
Customer.Clients = this.Clients;
return base.OnDisconnected(stopCalled);
}
}
}
第五步:建立Startup类
using Microsoft.Owin;
using Owin;
using SignalR.ActiveMQ;
using System;
[assembly: OwinStartup(typeof(SignalRDome.SignalR.Startup))]
namespace SignalRDome.SignalR
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.MapSignalR();
Customer.Run();//启动消费者监听线程
}
}
}
第六步:在前台页面中加入监听,一半添加在Index.aspx中
<script src="Scripts/jquery-1.10.2.min.js"></script>
<script src="Scripts/jquery.signalR-2.3.0.min.js"></script>
<script src="signalr/hubs"></script>
<script type="text/javascript">
$(function () {
///可以在这里进行权限验证,没有权限的客户端,不创建监听
var handler = $.connection.chatHub;// 生成客户端hub代理
// 添加客户端hub方法以供服务端调用
handler.client.broadcastMessage = function (call, msg) {
//接收服务端消息
alert(msg);
}
//日志输出,以备调试使用
$.connection.hub.logging = true;
// 开启hub连接
$.connection.hub.start();
});
</script>
至此asp.net web应用程序处理完成。
二、建立控制台应用程序(ProcucerDome)
第一步:引用Signalr.ActiveMQ
第二步:创建并发送消息
using SignalR.ActiveMQ;
using System;
namespace ProcucerDome
{
class Program
{
static void Main(string[] args)
{
///模拟前置机发送报警消息
Console.WriteLine("请输入要向客户端发送的消息:");
Procucer producer = Procucer.GetInstance();//创建消息生产者
while (true)
{
var msg = Console.ReadLine();//模拟报警消息
producer.Send(msg);//发送消息
}
}
}
}
至此,控制台应用程序处理完毕。
三、启动顺序
1、启动ActiveMQ程序
A)ActiveMQ服务器上要安装JAVA运行环境
b)下载ActiveMQ,官方网站下载:http://activemq.apache.org/
c)解压缩后双击apache-activemq-5.15.4\bin\win64\activemq.bat运行ActiveMQ程序。若服务器为32位系统,则双击win32文件下的activemq.bat运行ActiveMQ程序。
2、启动ProcucerDome项目
3、启动SignalRDome,开多个浏览器窗口,模拟多个SignalR客户端
注意事项:重启ActiveMQ程序后,应立即重启ProcucerDome及IIS,否则将出现前置机无法发送消息、web客户端无法接收消息情况。
注:SignalR参考地址:https://docs.microsoft.com/zh-cn/aspnet/signalr/
源代码及ActiveMQ下载:https://download.csdn.net/download/sinat_34114070/10568464