zoukankan      html  css  js  c++  java
  • 管理 SignalR 中的用户和组

    SignalR 中的用户

    SignalR允许向与特定用户关联的所有连接发送消息。 默认情况下,SignalR 使用与连接关联的 ClaimsPrincipal 中的 ClaimTypes.NameIdentifier 作为用户标识符。 单个用户可以有多个到 SignalR 应用的连接。 例如,用户可以连接到其桌面以及他们的手机上。 每个设备都有一个单独的 SignalR 连接,但它们都与同一用户关联。 如果向用户发送一条消息,则所有与该用户关联的连接都将收到该消息。 可以通过中心中的 Context.UserIdentifier 属性访问连接的用户标识符。
    向特定用户发送一条消息,方法是将用户标识符传递到中心方法中的 User 函数,如以下示例中所示:

    注意:用户标识符区分大小写。

    public Task SendPrivateMessage(string user, string message)
    {
        return Clients.User(user).SendAsync("ReceiveMessage", message);
    }
    

    SignalR 中的组

    组是与某个名称关联的连接的集合。 可以将消息发送到组中的所有连接。 建议将组发送到一个或多个连接,因为这些组由应用程序管理。 连接可以是多个组的成员。 这使得组非常适合作为聊天应用程序,其中每个会议室都可以表示为一个组。 可以通过 AddToGroupAsyncRemoveFromGroupAsync 方法将连接添加到组或从组中删除连接。

    public async override Task OnConnectedAsync()
    {
       var connid = Context.ConnectionId;
       var httpContext = Context.GetHttpContext();
       httpContext.Request.Query.TryGetValue("groupId", out StringValues groupid);
       httpContext.Request.Query.TryGetValue("userId", out StringValues userId);
       httpContext.Request.Query.TryGetValue("ip", out StringValues ip);
       if (!userId.Equals(StringValues.Empty))
       {
           if (_clients.ContainsKey(userId))
           {
               _clients.Remove(userId);
           }
           _clients.Add(userId, new ClientInfo()
           {
               ConnectionId = connid,
               GroupId = groupid,
               UserId = userId,
               Ip = ip
           });
           await Groups.AddToGroupAsync(connid, groupid);
           await SendConnection(groupid, new ConnectionMessageContent
           {
               From = userId,
               TransferCode = "上线",
               LocalServerCode = "Connection",
               Content = $"{userId}上线啦!!!"
           });
       }
    }
    

    上诉代码中await Groups.AddToGroupAsync(connid, groupid);将用户加入到组中去,具体详情参见https://github.com/jonny-xhl/Cy.WeChat

    使用用户组进行发送消息

    public async Task SendMessage(string from, string groupName, string msg)
    {
        await Clients.Group(groupName).ReceiveMessage(new UserMessageContent
        {
            Content = msg,
            From = from
        });
    }
    

    参考文档

  • 相关阅读:
    16.10.16学到的JAVA知识
    参数类型转换求和(JAVA)
    大道至简第一篇读后感之愚公移山(伪代码)
    First
    18.10.22 luoguP3374 【模板】树状数组 1
    18.10.16 luoguP3372 线段树模板-区间更新值&求和(POJ3468 A Simple Problem with Integers)
    18.10.16 POJ 2528 Mayor's posters(线段树+离散化)
    18.10.15 POJ 2182 Lost Cows(线段树)
    18.10.10 数算作业-字符串
    18.10.9 不好做的最长上升子序列(nlogn树状数组解LIS)
  • 原文地址:https://www.cnblogs.com/cqxhl/p/12993264.html
Copyright © 2011-2022 走看看