SignalR教程7-服务器端用户分组和管理组成员

关键词:

创建分组和添加组成员

SignalR分组提供了一种广播信息给指定客户端的方法,一个组里面可以有任意多个成员。同一个客户端可以存在于任意多个不同的组里面。

使用hub类的属性Groups的Add和Remove方法管理组,下面的例子展示客户端代码。

服务器端

public class ContosoChatHub : Hub
{
   public Task JoinGroup(string groupName)
   {
       return Groups.Add(Context.ConnectionId, groupName);
   }
   public Task LeaveGroup(string groupName)
   {
       return Groups.Remove(Context.ConnectionId, groupName);
   }
}

js客户端

contosoChatHubProxy.server.joinGroup(groupName);
contosoChatHubProxy.server.leaveGroup(groupName);

不需要创建分组,第一次加入成员组会自动创建,移除最后一个连接成员组自动删除。

SignalR 发送消息给客户端和组基于pub/sub model, 没有获得组列表和组内成员列表的API。服务器不管理组的列表和组内成员的列表,这提高了扩展性, 因为无论何时你添加一个node到一个web form,SignalR可以把连接设置为任何状态。

异步执行Add和Remove方法

Groups.Add和 Groups.Remove 方法是异步的. 如果想要向一个组添加一个客户端,同时立即通过组向用户发送一个消息,那么就必须确保Groups.Add方法执行完毕,下面的代码演示了如何做到:

将一个客户端添加到组

public async Task JoinGroup(string groupName)
{
   await Groups.Add(Context.ConnectionId, groupName);
   Clients.Group(groupname).addContosoChatMessageToPage(Context.ConnectionId + " added to group");
}

组内成员保持

SignalR 跟踪的是连接,而不是用户, 所以如果想让一个用户每次连接的时候都在同一个组里,那么必须每次连接都调用 Groups.Add 方法。

短暂的连接丢失,SignalR有时可以自动存储连接,这时候使用的是保存的连接而不是新的连接,因为组成员是客户端自动保持的,即使服务器错误或者重启后也可以重连,如果一个服务器停机同时启用新服务器,只要在连接时间内,连接也是可以保持的。

当连接因为连接丢失不能自动存储,或者当连接到期或者断开(例如浏览器跳转页面),组成员丢失。那么下次的连接就是一个新的连接。为了保证同一个用户每次连接记录组信息,建立的app必须自行记录用户分组等信息,然后在连接时加入组。

更多关于连接和重连的信息,参见How to handle connection lifetime events in the Hub class .
.

单一用户组

使用SignalR的应用必须保持跟踪用户和连接之间的关联,来了解哪个用户发送了消息或者哪个用户应该接收消息。可以使用组来实现这种做法

单一用户组.

可以指定用户名作为组的名字, 同时每次用户连接或者重连的时候添加正确的连接ID给这个组。给这个用户发送消息即给这个组发送消息,这种做法的一个缺点就是组不提供查看用户是否在线的方法。

跟踪记录用户名和connection ID之间的关联.

可以将用户名和他所使用过的connection ID存储起来,如存入数据库,同时每次用户连接或者断开的时候更新存储的数据。这样发送消息给用户就可以指定连接ID,这种做法的缺点是占用更多的内存。



作者:songshizhao 发表于:2017-11-13T10:47:36 访问量:1197
评论 [发表评论]