如何搭建SignalR服务器和客户端(c#)

来源:互联网 发布:北京行知实验小学咋样 编辑:程序博客网 时间:2024/06/07 12:00

​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服务。

原创粉丝点击