qidao123.com技术社区-IT企服评测·应用市场

标题: SignalR实时通信,多客户端与服务端交互 [打印本页]

作者: 汕尾海湾    时间: 2025-4-17 11:18
标题: SignalR实时通信,多客户端与服务端交互
1.SignalR先容

SignalR是一个开源的库,跨平台;让Web应用与其他应用通讯变得很简朴,Web服务端可以实时的将内容推送给对应的客户端,客户端发送的信息也可以实时到其他客户端。
SignalR提供了一种远程过程调用(RPC)的方式,使得客户端可以调用服务器的方法,同样在服务器端的方法中也能调用客户端的方法。
1.1 SignalR的通信方式

SignalR支持如下的方式实现实时通信:
SignalR会自动选择服务器和客户端能力范围内的最佳通信方式(是不是很优秀) ,当然也可以手动指定。
1.2 SignalR的应用场景

其实对于Web模式下的实时通信,SignalR用上试试,感觉还是很给力的。
2.案例展示

2.1 SignalR服务端展示

hub类
  1.         public class ChatHub : Hub
  2.         {
  3.                 private static readonly ConcurrentDictionary<string, User> ChatClientDict = new(); //用户字典
  4.                 /// <summary>
  5.                 /// 给所有人发消息
  6.                 /// </summary>
  7.                 /// <param name="userId"></param>
  8.                 /// <param name="msg"></param>
  9.                 /// <returns></returns>
  10.                 public async Task SendMsg(long userId, string msg)
  11.                 {
  12.                         string sendMsg = $"用户名{Context.ConnectionId}:{msg}";
  13.                         //服务端推送给 除自已以外 的所有客户端
  14.                         //await Clients.Others.SendAsync("ReceiveMsg", sendMsg);
  15.                         //服务端推送给所有客户端
  16.                         await Clients.All.SendAsync("ReceiveMsg", sendMsg);
  17.                 }
  18.                 /// <summary>
  19.                 /// 给指定人员发消息
  20.                 /// </summary>
  21.                 /// <param name="userId"></param>
  22.                 /// <param name="message"></param>
  23.                 /// <returns></returns>
  24.                 /// <exception cref="ArgumentException"></exception>
  25.                 public async Task SendMessageToUser(string userId, string message)
  26.                 {
  27.                         // 确保用户ID是有效的
  28.                         if (string.IsNullOrEmpty(userId))
  29.                         {
  30.                                 throw new ArgumentException("Invalid user ID", nameof(userId));
  31.                         }
  32.                         await Clients.Client(userId).SendAsync("ReceiveToUserMsg", message);
  33.                 }
  34.                 //客户端成功连接时,会触发此方法
  35.                 public override Task OnConnectedAsync()
  36.                 {
  37.                         var cid = Context.ConnectionId;
  38.                         //根据id获取指定客户端
  39.                         var client = Clients.Client(cid);
  40.                         return Task.CompletedTask;
  41.                 }
  42.                 //客户端断开连接时,会触发此方法
  43.                 public override Task OnDisconnectedAsync(Exception? exception)
  44.                 {
  45.                         return Task.CompletedTask;
  46.                 }
  47.                 //客户端调用服务端更新数据时,会触发此方法
  48.                 public async Task UpdateMessage(MsgInfo ReceiveMessage)
  49.                 {
  50.                         await Clients.All.SendAsync("UpdateData", ReceiveMessage);
  51.                 }
  52.         }
复制代码

注册相关服务及管道

2.2 winform客户端

客户端的核心代码:
客户端调用服务端的chathub类中的UpdateMessage方法,将客户端数据更新到服务端

服务端与客户端的交互逻辑

数据展示

案例源码地址:https://gitee.com/chenshibao/csb.-signal-r

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/) Powered by Discuz! X3.4