2017-05-03 42 views
0

我正在为我的工作场所创建一个信号器聊天应用程序,供客户和支持人员使用。它的一切正常,但我需要防止客户看到对方,只看到在线支持人员,同样在支持端,他们只看到在线客户端,而不是其他支持人员。我搜索了这个,发现最好的实现方式是使用groupA组(支持人员)只能看到groupB(客户端)中的在线用户,而groupB中的用户只能看到groupA中的在线用户。实施信号器组

这是我的HUB类:

`#地区--- ---方法

public void Connect(string UserName, int UserID) 
    { 
     var id = Context.ConnectionId; 

     if (ConnectedUsers.Count(x => x.ConnectionId == id) == 0) 
     {     
      ConnectedUsers.Add(new UserDetail { ConnectionId = id, UserName = UserName, UserID = UserID }); 
     } 
     UserDetail CurrentUser = ConnectedUsers.Where(u => u.ConnectionId == id).FirstOrDefault(); 
     // send to caller   
     Clients.Caller.onConnected(CurrentUser.UserID.ToString(), CurrentUser.UserName, ConnectedUsers, CurrentMessage, CurrentUser.UserID); 
     // send to all except caller client   
     Clients.AllExcept(CurrentUser.ConnectionId).onNewUserConnected(CurrentUser.UserID.ToString(), CurrentUser.UserName, CurrentUser.UserID); 

    } 

    public void SendMessageToAll(string userName, string message) 
    { 
     // store last 100 messages in cache 
     //AddMessageinCache(userName, message); 

     // Broad cast message 
     //Clients.All.messageReceived(userName, message); 
    } 

    public void SendPrivateMessage(string toUserId, string message) 
    { 
     try 
     { 
      string fromconnectionid = Context.ConnectionId; 
      string strfromUserId = (ConnectedUsers.Where(u => u.ConnectionId == Context.ConnectionId).Select(u => u.UserID).FirstOrDefault()).ToString(); 
      int _fromUserId = 0; 
      int.TryParse(strfromUserId, out _fromUserId); 
      int _toUserId = 0; 
      int.TryParse(toUserId, out _toUserId); 
      List<UserDetail> FromUsers = ConnectedUsers.Where(u => u.UserID == _fromUserId).ToList(); 
      List<UserDetail> ToUsers = ConnectedUsers.Where(x => x.UserID == _toUserId).ToList(); 

      if (FromUsers.Count != 0 && ToUsers.Count() != 0) 
      { 
       foreach (var ToUser in ToUsers) 
       { 
        // send to                       //Chat Title 
        Clients.Client(ToUser.ConnectionId).sendPrivateMessage(_fromUserId.ToString(), FromUsers[0].UserName, FromUsers[0].UserName, message); 
       } 


       foreach (var FromUser in FromUsers) 
       { 
        // send to caller user                    //Chat Title 
        Clients.Client(FromUser.ConnectionId).sendPrivateMessage(_toUserId.ToString(), FromUsers[0].UserName, ToUsers[0].UserName, message); 
       } 
       // send to caller user 
       //Clients.Caller.sendPrivateMessage(_toUserId.ToString(), FromUsers[0].UserName, message); 
       //ChatDB.Instance.SaveChatHistory(_fromUserId, _toUserId, message); 
       MessageDetail _MessageDeail = new MessageDetail { FromUserID = _fromUserId, FromUserName = FromUsers[0].UserName, ToUserID = _toUserId, ToUserName = ToUsers[0].UserName, Message = message }; 
       AddMessageinCache(_MessageDeail); 
      } 
     } 
     catch { } 
    } 

    public void RequestLastMessage(int FromUserID, int ToUserID) 
    { 
     List<MessageDetail> CurrentChatMessages = (from u in CurrentMessage where ((u.FromUserID == FromUserID && u.ToUserID == ToUserID) || (u.FromUserID == ToUserID && u.ToUserID == FromUserID)) select u).ToList(); 
     //send to caller user 
     Clients.Caller.GetLastMessages(ToUserID, CurrentChatMessages); 
    } 

    public void SendUserTypingRequest(string toUserId) 
    { 
     string strfromUserId = (ConnectedUsers.Where(u => u.ConnectionId == Context.ConnectionId).Select(u => u.UserID).FirstOrDefault()).ToString(); 

     int _toUserId = 0; 
     int.TryParse(toUserId, out _toUserId); 
     List<UserDetail> ToUsers = ConnectedUsers.Where(x => x.UserID == _toUserId).ToList(); 

     foreach (var ToUser in ToUsers) 
     { 
      // send to                        
      Clients.Client(ToUser.ConnectionId).ReceiveTypingRequest(strfromUserId); 
     } 
    } 

    public override System.Threading.Tasks.Task OnDisconnected(bool stopCalled) 
    { 
     var item = ConnectedUsers.FirstOrDefault(x => x.ConnectionId == Context.ConnectionId); 
     if (item != null) 
     { 
      ConnectedUsers.Remove(item); 
      if (ConnectedUsers.Where(u => u.UserID == item.UserID).Count() == 0) 
      { 
       var id = item.UserID.ToString(); 
       Clients.All.onUserDisconnected(id, item.UserName); 
      } 
     } 
     return base.OnDisconnected(stopCalled); 
    } 
    #endregion 

    #region---private Messages--- 
    private void AddMessageinCache(MessageDetail _MessageDetail) 
    { 
     CurrentMessage.Add(_MessageDetail); 
     if (CurrentMessage.Count > 100) 
      CurrentMessage.RemoveAt(0); 
    } 
    #endregion 

    public Task JoinGroup(string groupName) 
    { 
     return Groups.Add(Context.ConnectionId, groupName); 
    } 
    public Task LeaveGroup(string groupName) 
    { 
     return Groups.Remove(this.Context.ConnectionId, groupName); 
    } 
} 

}` 我的javascript:

$.connection.hub.start().done(function() { 
    registerEvents(chatHub); 
    chatHub.server.joinGroup("GroupA") 

}); 
+0

你还没有问了一个问题:

var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); var connectionID = HttpContext.Request.Cookies["conn-id"].Value; context.Clients.AllExcept(connectionID).addMessage(message); 

此代码示例是从这个太问题采取了?你想知道什么?? –

+0

我想知道如何实现2个组,使得A组查看来自B组的在线用户,反之亦然,或者换句话说,用户不能看到他们自己的组中的人,而是看到另一个组中的人 – Trev

回答