SignalR实时通信,多客户端与服务端交互

1.SignalR介绍

SignalR是一个开源的库,跨平台;让Web应用与其他应用通讯变得很简单,Web服务端可以实时的将内容推送给对应的客户端,客户端发送的信息也可以实时到其他客户端。

SignalR提供了一种远程过程调用(RPC)的方式,使得客户端可以调用服务器的方法,同样在服务器端的方法中也能调用客户端的方法。

1.1 SignalR的通信方式

SignalR支持如下的方式实现实时通信:

  • WebSockets:是一种在单个TCP连接上进行全双工通信的协议,使得服务器和浏览器的通信更加简单,服务端可以主动发送信息。
  • Server-Sent Events:SSE 与 WebSocket 作用相似,都是建立浏览器与服务器之间的通信渠道,然后服务器向浏览器推送信息。WebSocket是双向的,而SSE是单向的。
  • **Long Polling(长轮询) **:和传统的轮询原理一样,只是服务端不会每次都返回响应信息,只有有数据或超时了才会返回,从而减少了请求次数。

SignalR会自动选择服务器和客户端能力范围内的最佳通信方式(是不是很优秀) ,当然也可以手动指定。

1.2 SignalR的应用场景

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

  • 服务端主动推送信息;比如发送公告场景;
  • 监控或看板数据实时显示;比如监控系统实时展示分布到各个客户端上的数据;
  • 服务端和客户端交互;比如客服系统的聊天场景。

2.案例展示

2.1 SignalR服务端展示

  • 创建一个net8的webapi项目,引入nuget包:Microsoft.AspNetCore.SignalR
  • 编写自己的SignalR Hub

hub类

	public class ChatHub : Hub
	{
		private static readonly ConcurrentDictionary<string, User> ChatClientDict = new(); //用户字典
		/// <summary>
		/// 给所有人发消息
		/// </summary>
		/// <param name="userId"></param>
		/// <param name="msg"></param>
		/// <returns></returns>
		public async Task SendMsg(long userId, string msg)
		{
			string sendMsg = $"用户名{Context.ConnectionId}:{msg}";

			//服务端推送给 除自已以外 的所有客户端
			//await Clients.Others.SendAsync("ReceiveMsg", sendMsg);

			//服务端推送给所有客户端
			await Clients.All.SendAsync("ReceiveMsg", sendMsg);

		}

		/// <summary>
		/// 给指定人员发消息
		/// </summary>
		/// <param name="userId"></param>
		/// <param name="message"></param>
		/// <returns></returns>
		/// <exception cref="ArgumentException"></exception>
		public async Task SendMessageToUser(string userId, string message)
		{
			// 确保用户ID是有效的
			if (string.IsNullOrEmpty(userId))
			{
				throw new ArgumentException("Invalid user ID", nameof(userId));
			}
			await Clients.Client(userId).SendAsync("ReceiveToUserMsg", message);
		}

		//客户端成功连接时,会触发此方法
		public override Task OnConnectedAsync()
		{
			var cid = Context.ConnectionId;
			//根据id获取指定客户端
			var client = Clients.Client(cid);
			return Task.CompletedTask;
		}

		//客户端断开连接时,会触发此方法
		public override Task OnDisconnectedAsync(Exception? exception)
		{
			return Task.CompletedTask;
		}

		//客户端调用服务端更新数据时,会触发此方法
		public async Task UpdateMessage(MsgInfo ReceiveMessage)
		{
			await Clients.All.SendAsync("UpdateData", ReceiveMessage);
		}


	}
  • 业务API编写,推送消息

      IHubContext<ChatHub> _hubContext 定义一个hub上下文,通过这个可以获取所有客户端,并进行方法调用PushMessage,推送消息
    

注册相关服务及管道

2.2 winform客户端

客户端的核心代码:

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

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

数据展示

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

来源链接:https://www.cnblogs.com/chenshibao/p/18830358

© 版权声明
THE END
支持一下吧
点赞6 分享
评论 抢沙发
头像
请文明发言!
提交
头像

昵称

取消
昵称表情代码快捷回复

    暂无评论内容