SignalRASP .NET SignalR 是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信。什么是实时通信的Web呢?就是让客户端(Web页面)和服务器端可以互相通知消息及调用方法,当然这是实时操作的。
SignalR当然也提供了非常简单易用的高阶API,使服务器端可以单个或批量调用客户端上的JavaScript函数,客户端也可以调用服务器端的方法,并且非常方便地进行连接管理,例如客户端连接到服务器端,或断开连接,客户端分组,以及客户端授权,使用SignalR都非常容易实现。
**SignalR服务器可以搭载IISExpress、SelfHost、Nginx,客户端可以为winform、console控制台。
本文将分三种服务进行实测,测试传输数据的效率**
1、搭载IISExpress服务器
服务端搭建
1、创建ASP.NET Web应用程序项目,选择MVC模板,如下图
2、添加引用
通过NuGet下载Microsoft.AspNet.SignalR
3、新建MyHub.cs文件,即我们自己服务中的集线器
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Task;
using System.Web;
using Microsoft.AspNet.SignalR;
using Microsoft.AspNet.SignalR.Hubs;
using System.Text;
public class MyHub:Hub
{
readonly IHubContext _hubContext;
public MyHub():base()
{
_hubContext = GlobalHost.ConnectionManager.GetHubContext<ServerHub>();
}
//Clients.All.Hello() 去调用所有连接上的客户端中hello()方法,即Hello() 是客户端中的方法
public void Hello()
{
Clients.All.hello();
}
public void Send(string msg)
{
string name="NiHao";
Clients.All.SendMessage(name,msg);
}
//客户端连接上时,会进入到此方法中
public override Task OnConnected()
{
Trace.WriteLine("客户端连接成功");
return base.OnConnected();
}
public override Task OnReconnected()
{
Trace.WriteLine("客户端重连中");
return base.OnReconnected();
}
public override Task OnDisconnected(bool stopCalled)
{
return base.OnDisconnected(stopCalled);
}
}
4、我们需要在Startup.cs中搞点事儿
public void Configuration(IAppBuilder app)
{
app.UseCors(CorsOption.AllowAll);
app.MapSignalR();
}
这样我们服务器就搭建成功了!!
注:我们服务在IISExpress中的端口号是系统自动分配的,我们如何设置固定的端口号呢?
打开项目文件夹中.vs文件中的applicationhost.config,
<site name="项目名" id="2">
<application path="/" applicationPool="Clr4IntegratedAppPool">
<virtualDirectory path="/" physicalPath="文件路径" />
</application>
<bindings>
<binding protocol="http" bindingInformation="*:2141:localhost" />
<binding protocol="http" bindingInformation="*:2141:192.168.2.113" />
</bindings>
</site>
添加固定IP地址和端口号如上。
当你的SignalR客户端在手机端的话,是接连不上IISExpress服务器的。
方法:需要以管理员身份运行cmd,输入以下命令开启incoming connect
–netsh http add urlacl url=http://192.168.1.42:58938/ user=everyone
–netsh advfirewall firewall add rule name=”IISExpressWeb” dir=in protocol=tcp localport=58938 profile=private remoteip=localsubnet action=allow
客户端搭建
客户端可以在console控制台和winform运行,这边放上console控制台的代码,winform中的代码其实跟控制台是一样的。
1、创建控制台项目
2、添加引用(NuGet中下载Microsoft.AspNet.SignalR.Client)
3、代码如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNet.SignalR.Client;
namespace ClientsConsole
{
class Program
{
static void Main(string[] args)
{
string url = "http://127.0.0.1:2141";
HubConnection _conn = new HubConnection(url,true);
IHubProxy _proxy = _conn.CreateHubProxy("MyHub");
_conn.Start();
//定义客户端的方法sendMessage()(有两个string类型的参数,当服务端调用sendMessage,需要传入2个string类型参数),以这种格式定义方法服务端才能去调用
_proxy.On<string, string>("sendMessage", (n, s) =>
{
});
_conn.StateChanged += new Action<StateChange>(tgt =>
{
if (((StateChange)tgt).NewState == Microsoft.AspNet.SignalR.Client.ConnectionState.Connected)
{
t1 = Environment.TickCount;
//客户端调用服务端的 Send() 方法,传入参数"Hello"
_proxy.Invoke("send", "Hello");
}
});
Console.ReadLine();
}
}
}
总结:第一次写博客,有些可能考虑的不周到,有什么问题随时可以问我,后面会写上SignlaR的SelfHost服务和如何在Linux中负载Nginx服务。