即时通信在日常的web开发场景中经常使用,本篇主要回顾一下SignalR的实现原理和通过例子说明如何在.NET Core 中使用。
SingnalR 应用
- 需要从服务器进行高频更新的应用程序。例如游戏、社交网络、投票、拍卖、地图和 GPS 应用程序。
- 仪表板和监控应用程序。示例包括公司仪表板、即时销售更新或旅行提醒。
- 协作应用程序。白板应用程序和团队会议软件是协作应用程序的示例。
- 需要通知的应用程序。社交网络、电子邮件、聊天、游戏、旅行提醒和许多其他应用程序都使用通知。
SingnalR 实现的技术
- 网络套接字 Websocket
- 服务器发送的事件 SSE
- 长轮询 Long Polling
这里对它们做一个简单的解释,长轮询 Long Polling 相比于简单的重复发送请求,它有以下的好处。长轮询的请求会一直pending在那,直到有状态更新或者timeout,如果timeout,前端会继续进行下一次的长轮询;
服务器发送的事件 SSE 是一个单向的,基于事件的处理方案,服务器发起http 连接到浏览器,之后浏览器会使用EventSource 这个object对后端传输过来的message进行处理,不过缺点是 SSE是单向的,并数据格式为文本信息;
网络套接字 Websocket: 利用TCP套接字,支持客户服务端双向的传输message,由于套接字的传输格式支持多种,因此websocket 本身不仅支持文本格式的消息还有二进制数据的传输。
SingnalR 开发
SingalR 在net core里使用变得比较简单, 主要有几个概念要理解透彻:
1. Hub: 可以看成一个集散中心,里面管理了通过webscoket 与之相连的客户端;
2. Clients: Hub 中的属性,与当前hub相连接的客户端;
3. Groups:对clients进行分组管理
Hub中还有一些虚方法,例如:OnConnectedAsync, OnDisconnectedAsync 用于我们重写去实现我们自己的逻辑。
Hub 示例:
public class CoffeeHub: Hub { private readonly OrderChecker _orderChecker; public CoffeeHub(OrderChecker orderChecker) { _orderChecker = orderChecker; } //override the OnConnectedAsync
public override async Task OnConnectedAsync() {
var connectionId = Context.ConnectionId;
await Clients.Others.SendAsync("Hello", $"I am {connectionId}");
} }
ConnectionId 唯一标识一个与HUb相连的connecttion。
-------------------------------------------------------------------
会持续整理发布关于后端和NET Core, .NET 的相关学习和认知,欢迎大家一起讨论学习。