Winform中使用signalr

在winform中使用Hub

搭建signalr分为服务端与客户端
服务端:
signalr可以使用Owin托管在winform中

1. 首先下载nuget包:
Microsoft.AspNet.SignalR
Microsoft.Owin.Hosting
Microsoft.Owin.Host.HttpListener

2. 实现在winform中的托管
在Program中:

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    var signalrUrl = "http://localhost:8082";
    //signalr的发布
    var signalr = WebApp.Start(signalrUrl, Configuration);
    Application.Run(new Sign());
    signalr.Dispose();
    //Application.Run(new Form2());
}

public static void Configuration(IAppBuilder app)
{
	//可以在这里做一些配置,向跨域什么的  app.usecors 或者 configuration中配置usejsonp
	HubConfiguration configuration = new HubConfiguration
    {
        EnableDetailedErrors = true
    };
    //这里也可以自定义signalr的房屋内路径 默认为发布路径/signalr 也就是http://localhost:8082/signalr
    app.MapSignalR(configuration);
}

3. 实现一个hub

新建一个类继承hub

//默认访问的hub名是首字母变小写的名称,如果没有HubName的注解的话,这个hub的名是myHub
[HubName("DataHub")]
public class MyHub : Hub
 {
 	//客户端发送数据时调用的方法
   [HubMethodName("Hello")]
   public void Hello(string name)
   {
   		//这里有很多方法,就不一一写了
   		//SayHello 客户端接收时的方法
       Clients.All.SayHello($"欢迎{name}上线");
   }
 }

这样启动程序,服务端就OK了

客户端

在另外的winform程序中就可以连接到服务,调用方法实现通讯了

1. 需要下载nuget包:
Microsoft.AspNet.SignalR.Client

2. 连接服务

IHubProxy proxy;
//根据url连接signalr服务
var connection = new HubConnection("http://localhost:8082/signalr");
//根据hub名创建代理,一些操作由这个代理来做
proxy = connection.CreateHubProxy("CadreHub");
 await connection.Start();
 //注册收到数据时的方法名与执行的操作,类似于事件
 proxy.On<string>("SayHello", (message) =>
 {
 	//异步调用messagebox嘛,就用一些委托
     this.BeginInvoke(new Action(() =>
     {
          MessageBox.Show(msg);
      }));
 });

3. 调用服务上的方法

 private void Button1_Click(object sender, EventArgs e)
 {
      proxy.Invoke("Hello", "qi");
  }

服务端调用Hub内方法

有时候需要服务端主动调用方法来做到一些广播之类的,但是hub是不能实例化的,每次访问hub的时候,内部会自动给创建实例,那怎么操作,当然可以创建静态方法啦,不过方法内部不能直接调用Client了,需要获取Context

[HubName("DataHub")]
public class MyHub : Hub
 {
 	//客户端发送数据时调用的方法
   [HubMethodName("Hello")]
   public void Hello(string name)
   {
   		//这里有很多方法,就不一一写了
   		//SayHello 客户端接收时的方法
       Clients.All.SayHello($"欢迎{name}上线");
   }
   
   //这里这里这里
   	public static void Broadcast(string name)
	{
	//通过全局变量GlobalHost的ConnectionManager获取一个hub的引用
     var context = GlobalHost.ConnectionManager.GetHubContext<DataHub>();
     context.Clients.All.SayHello($"欢迎{name}上线_version1.1");
 	}
 }

然后就可以在其他类中调用了

MyHub.Broadcast("little Tom");

时间有限 写的比较捉急 ,可能有一些没写出来的, 见谅 领导要来了 溜了溜了

你可能感兴趣的:(c#,SignalR,Winform)