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

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

  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值