SignalR实现服务器推送信息:广播与“组播”

    SignaR可以用来实现服务器向客户端推送信息,但是SignalR的每个Hub的生命周期很短,不能长期停留在内存里。因此,如果服务器想要对客户端推送消息时,应该采用signalR的一个“全局”的上下文来实现。此功能的应用背景是:服务器的数据发生了更新,它希望向所有的用户、某个分组的用户或者是单个用户发送推送消息,而不是由客户端发送请求来检测数据是否有更新。这才是真正的SignalR要做的事!

在Asp.Net有关SignalR的介绍里有提到向所有用户发送推送消息的实现方式(参见: http://www.asp.net/signalr/overview/signalr-20/getting-started-with-signalr-20/tutorial-server-broadcast-with-signalr-20)。但是向分组的用户或单个用户发送消息的实现方式,并没有提供。本文将说明如何向分组推送消息,其他的两种实现很相似。

另外,在我发现Signalr有提供全局机制之前,我采用了让一个Hub长期停留在内存的方式实现。大致意思为:
    我需要实现一个Hub,它可以动态地检测数据库数据的变化,然后推送给前端相关的用户。如果直接在继承Hub的类里实现,并调用的话,也就意味着由SignalR创建的所有Hub都要长时间地停留在内存里,而且由于我的推送信息是根据组(Group)进行的。结果导致的问题就是:有太多的Hub停留在内存了;而且针对某个分组的消息,会因为有多个Hub(每个Hub的实现是一样的)而发送多次。
    后来,我想到了一个解决这个的办法,就是我只在内存里保留一个Hub的实例。这样就不会出现一条消息多次发送的问题了。具体的做法是:  
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
SignalR 是一个 Microsoft 开发的开源实时网络库,它可以让开发者轻松地实现服务器与应用程序之间的实时通信。其中,服务器可以向客户端消息,客户端也可以向服务器消息。 对于服务器向客户端消息,SignalR 提供了以下常用的方法: - `Clients.All.SendAsync()`:向所有连接的客户端发消息。 - `Clients.User(userId).SendAsync()`:向指定用户发消息。 - `Clients.Group(groupId).SendAsync()`:向指定组中的所有客户端发消息。 - `Clients.Caller.SendAsync()`:向当前连接的客户端发消息。 对于客户端向服务器消息,SignalR 提供了以下方法: - `connection.invoke()`:调用服务器上的方法。 - `connection.send()`:向服务器消息。 在使用 SignalR 时,需要在服务器端创建一个 Hub 类,该类继承自 `Microsoft.AspNetCore.SignalR.Hub` 类,并定义需要向客户端的方法。在客户端,需要使用 SignalR 客户端库连接到服务器,并订阅服务器的消息。 示例代码如下: 服务器端: ```csharp using Microsoft.AspNetCore.SignalR; public class ChatHub : Hub { public async Task SendMessage(string user, string message) { await Clients.All.SendAsync("ReceiveMessage", user, message); } } ``` 客户端: ```javascript var connection = new signalR.HubConnectionBuilder().withUrl("/chatHub").build(); connection.on("ReceiveMessage", (user, message) => { console.log(user + " says: " + message); }); connection.start().then(() => { console.log("Connected"); connection.invoke("SendMessage", "User1", "Hello"); }).catch((err) => console.error(err.toString())); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值