首页 > 其他分享 >SignalR 的使用

SignalR 的使用

时间:2022-11-13 15:00:36浏览次数:55  
标签:Task await server SignalR client 使用 async

概念

SignalR 可以实现实时的 Web 功能,使服务端可以实时的向客户端传输数据

官网介绍

使用场景

  • 需要从服务器进行高频率更新的应用。比如游戏、社交网络等
  • 需要通知的应用。比如邮件应用、聊天等
  • Dashboard,数据需要实时更新等

通信方式

  • WebSockets
  • Server-Sent Events
  • Long Polling

使用

需要两个角色:Server 和 Client

Server

SignalR 是集成在 AspNetCore 中的,所以不用添加单独的包,可以直接使用

SignalR 有五种使用模式,如下:

  • Client 调用 Server,无返回值

  • Client 调用 Server,有返回值

  • Server 调用 Client 监听的方法(可能存在多个 client,分下面五种情况)

    • 哪个 client 调的 server,server 就调哪个 client

        Clients.Caller.SendAsync
      
    • 调用所有的 client

        Clients.All.SendAsync
      
    • 调用除自身(调用 server 的 client)以外的所有 client

        Clients.Others.SendAsync
      
    • 分组发送(调用指定组的所有 client)

        Groups.AddToGroupAsync
        Clients.Group(${groupName}).SendAsync        
      
    • 调用指定的 client

        Clients.Client(${connId}).SendAsync
      
  • server 通过流的方式向 client 发送数据

      // 发送流
      public async Task<ChannelReader<string>> SendStream()
      {
          Console.WriteLine("==服务端通过流的方式向客户端发送信息==");
          var channel = Channel.CreateUnbounded<string>();
          await Task.Run(async () =>
          {
              var list = await File.ReadAllLinesAsync("001.txt");
              foreach (var line in list)
              {
                  await channel.Writer.WriteAsync(line);
              }
          });
          return channel;
      }
    
      // 接收流
      public async Task ReceiveClientMsgByStream(ChannelReader<string> reader)
      {
          Console.WriteLine("==接收客户端通过流发来的信息==");
          await Task.Run(async () =>
          {
              while (await reader.WaitToReadAsync())
              {
                  while (reader.TryRead(out string? str))
                  {
                      Console.WriteLine(str);
                      await Task.Delay(1000);
                  }
              }
          });
      }
    
  • client 通过流的方式向 server 发送数据

      // 接收流
      var reader = await conn1.StreamAsChannelAsync<string>("SendStream");
      await Task.Run(async () =>
      {
          while (await reader.WaitToReadAsync())
          {
              while (reader.TryRead(out string? str))
              {
                  Console.WriteLine(str);
                  await Task.Delay(1000);
              }
          }
      });
    
      // 发送流
      var channel = Channel.CreateUnbounded<string?>();
      await conn1.SendAsync("ReceiveClientMsgByStream", channel.Reader);
      await Task.Run(async () =>
      {
          var list = await File.ReadAllLinesAsync("001.txt");
          foreach (var line in list)
          {
              await channel.Writer.WriteAsync(line);
          }
      });
    

代码实现

  1. 新建一个类,写相关的业务逻辑,需要继承自 Microsoft.AspNetCore.SignalR.Hub

     public class Chat : Hub
    
  2. 添加 SignalR 服务

     builder.Services.AddSignalR();
    
  3. 注册路由

     app.MapHub<Chat>("/chat");
    

Client

以 Console 示例

  1. 添加 nuget 包

    Microsoft.AspNetCore.SignalR.Client

  2. 创建 HubConnection,建立跟 Server 的连接

     HubConnection connection = new HubConnectionBuilder()
         .WithUrl("http://localhost:5253/chat")
         .Build();
    
  3. 可以增加一个 reconnect 事件

     connection.Closed += async (Exception? arg) =>
     {
         await Task.Delay(new Random().Next(0, 5) * 1000);
         await connection.StartAsync();
     };
    
  4. 添加一个监听事件,server 就是触发这个监听事件向 client 发送数据

     connection.On<string>("CallByHub", (response) =>
     {
         Console.WriteLine("我是:" + connectName + "; 服务器端传来的:" + response);
     });
    
  5. 最后就是写业务代码了,client 调用 server 可以使用如下方式

     // 无返回值
     conn.SendAsync() 
    
     // 有返回值
     conn.InvokeAsync<>()         
    

Demo

https://gitee.com/rory-j-liu/signalr-demo-self

标签:Task,await,server,SignalR,client,使用,async
From: https://www.cnblogs.com/liujiangbo/p/16885974.html

相关文章

  • Flex 的使用
    1.flex父容器container{display:flex;}中的display:flex可以令一个元素成为flex父容器1.1flex-direction用于控制主轴的方向row(默认值):主轴方向从左......
  • Abp vNext 使用邮件
    https://docs.abp.io/en/abp/latest/EmailingEncrypttheSMTPPasswordAbp.Mailing.Smtp.Passwordmustbeanencryptedvalue.IfyouusetheISettingManagertose......
  • Celery在项目中的使用
    一celery简要说明1Celery是一个功能完备即插即用的分布式异步任务队列框架。它适用于异步处理问题,当大批量发送邮件/短信等网络请求、或者大文件上传,批图图像处理等等......
  • 新u盘第一次使用要格式化吗
    U盘是USB盘的简称,特点是小巧便于携带、存储容量大、性价比高,常见的大小从128M、4G、8G等。那么新U盘第一次使用要格式化吗?U盘格式化FormatUSBflashdisk新U......
  • Vue中使用el-upload+XLSX实现解析excel文件为json数据
    场景业务要求为实现每天上报各部门计划人数,需要通过excel导入数据。前端可以解析excel数据并进行初步的格式校验。  导入成功之后解析的数据  excel里的数据......
  • IdelHandler介绍及使用
    https://blog.csdn.net/jdsjlzx/article/details/110532500IdleHandler主要是在MessageQueue出现空闲的时候被执行,那么何时出现空闲?MessageQueue是一个基于消息触发......
  • 在Visual Studio 中使用git系列文章目录
    在VisualStudio中使用git——什么是Git(一)在VisualStudio中使用git——给VisualStudio安装git插件(二)在VisualStudio中使用git——使用git管理源代码(三)在......
  • Gerrit 不使用代理服务的搭建配置
    1、前言Gerrit名声已很大了,我也就不在过多阐述介绍了,凡是需要安装搭建Gerrit服务器的,网上一搜索都是大把精彩教程。但是,基本都是基于代理服务的搭建安装,一种是基于apach......
  • 懒人听书下载文件被加密?使用这个工具一键解决!
    直接通过懒人听书上下载的声音是经过加密的,没办法通过其他播放器进行播放,也没法进行声音文件分享给其他小伙伴。 如果不懂电脑技术,是没办法进行解密的,不过有个工具帮我......
  • 使用 ASP.NET Core MVC 创建 Web API 系列文章目录
    使用ASP.NETCoreMVC创建WebAPI(一)使用ASP.NETCoreMVC创建WebAPI(二) 使用ASP.NETCoreMVC创建WebAPI(三)使用ASP.NETCoreMVC创建WebAPI(四)使用ASP.......