1、signalR简介
signalR 是一个开源的库,跨平台;可以让web应用与其他应用通讯变得非常简单,WEB服务端可以实时的将内容推送给对应的客户端,客户端发送的信息也可以实时到其他客户端。
signalR 提供了一种远程过程调用(RPC)的方式,使得客户端可以调用服务端的方法,同样在服务端的方法中也能调用刻画短的方法。
1.1signalR的通信方式
SignalR 支持如下的方式实时通信:
websockets:
是一种在单个TCP连接上进行全双工通信的协议,使得服务器和浏览器的通信更加简单,服务端可以主动发送信息。
Server-Sent Events:
SSE 与 WebSocket 作用相似,都是建立浏览器与服务器之间的通信渠道,然后服务器向浏览器推送信息。websocket 是双向,而 SSE是单向的。
Long Polling(长轮询):
和传统的轮序原理一样,只是服务端不会每次都返回相应信息,只有有数据或超时了才会返回,从而减少了请求次数。
SignalR会自动选择服务器和客户端能力范围内的最佳通信方式,当然也可以手动指定。
1.2 SignalR的应用场景
其实对于Web模式下的实时通信,SignalR用上试试
服务端主动推送信息;比如发送公告场景。
监控或看板数据实时显示;比如监控系统实时展示分布到各个客户端上的数据
服务端和客户端交互;比如客服系统的聊天场景。
三:SignaIR入门简单的例子
这才是重点,以上的介绍大家肯定对Asp.net signalR有了一个初步的了解,接下我们开始实践操作了。
先来看一下最终要实现的效果图吧:
1.新建一个MVC项目,我用的是Vs2015默认添加的是MVC5
2."引用" 右键点击 》管理Nuget程序包》搜索signalR,添加完signalR你可以在 Scripts 文件夹下看到:
3.向项目中添加一个signalR集线器(V2)命名为ServerHub:
4.在刚刚新建的ServerHub.cs 中写入 一下代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Microsoft.AspNet.SignalR;
using Microsoft.AspNet.SignalR.Hubs;
using System.Data;
using System.Threading.Tasks;
namespace SignaIREasyDemo
{
public class ServerHub : Hub
{
public void SendMsg(string message)
{
//调用所有客户端的sendMessage方法
Clients.All.sendMessage(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),message);
}
}
}
5.如果你是vs2015 的话添加的mvc项目 不进行身份验证的那种吧,必须得添加一个 Startup 类. 如果没有这个类,请添加,不然的话项目运行不起来的,具体代码如下:
using Microsoft.Owin;
using Owin;
[assembly: OwinStartup(typeof(SignalRQuickStart.Startup))]
namespace SignalRQuickStart
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
// 有关如何配置应用程序的详细信息,请访问 http://go.microsoft.com/fwlink/?LinkID=316888
// 配置集线器
app.MapSignalR();
}
}
}
6.在Control 里新建一个Chat Action方法,在Chat视图里代码如下:
@{
ViewBag.title = "SignaIR聊天窗口";
}
<div class="container">
<input type="text" id="message" />
<input type="button" id="sendmessage" value="Send" />
<input type="hidden" id="displayname" />
<ul id="messageBox"></ul>
</div>
@section scripts
{
<script src="~/Scripts/jquery.signalR-2.2.1.min.js"></script>
<script src="~/signalr/hubs"></script>
<script>
$(function () {
//引用自动生成的集线器代理
var chat = $.connection.serverHub;
//定义服务器调用的客户端sendMessage来显示新消息
chat.client.sendMessage = function (name, message)
{
//向页面添加消息
$("#messageBox").append('<li><strong style="color:green">'+htmlEncode(name)+'</strong>:'+htmlEncode(message)+'</li>');
}
//设置焦点到输入框
$('#message').focus();
//开始连接服务器
$.connection.hub.start().done(function () {
$('#sendmessage').click(function () {
//调用服务器端集线器的Send方法
chat.server.sendMsg($('#message').val());
//清空输入框信息并获取焦点
$("#message").val('').focus();
})
})
});
//为显示的消息进行html编码
function htmlEncode(value)
{
var encodeValue = $('<div/>').text(value).html();
return encodeValue;
}
</script>
}
好了,一个signalR简单的入门的例子就ok了,最终的效果图在上面也已经看到了。下面我们就简单的分析一下吧
从最终的效果图 我们可以看到,在任何一个web 页面中发送的消息所有的 页面都会接收到该消息。这种应用在IM系统非常广泛常见。
当然signalR并不局限于这种B/S模式的消息推送,在C/S 同样也能应用,目前我们公司xamarin android所用的就是这个signalR实现的PC之间、PC与移动端、移动端与移动端之间的交流,使用之后会发现的确挺方便的。
有人可能感觉很郁闷了,在视图中引入 这段js有什么作用?也并有写啊。
注意!,这是虚拟目录,也就是你在OWIN Startup中注册的地址
<script src="~/signalr/hubs"></script>
其实在服务器端声明的所有Hub信息,最终都会生成JavaScript输出到客户端,其实谷歌浏览器中F12 ,在Sources你就可以看到写的源代码了:
还是来看一下在这种B/S 模式中 signalR是如何运行的吧。首先程序开始的时候,Web页面就已经与signalR的服务建立连接。
$.connection.hub.start() 意思就是有signalR服务建立连接
.done 函数表示连接成功后为发送的按钮绑定一个单击事件
发送消息的方法:chat.server.sendMsg($('#message').val())
在ServerHub重写一个 OnConnected 方法来监控客户端的连接情况,的确程序运行的时候web页面就已经开始建立连接了,在调试的时候可以在输入中看到 "客户端连接成功!"
//重写OnConnected 方法
public override Task OnConnected()
{
System.Diagnostics.Trace.WriteLine("客户端连接成功!");
return base.OnConnected();
}