2017-05-03 3 views
0

나는 내 직장이 클라이언트와 지원에 사용될 수 있도록 신호 대화 앱을 만들고있다. 그것들은 모두 정상적으로 작동하지만 클라이언트가 서로를 보지 못하게하고 온라인 지원 담당자 만 볼 필요가 있습니다. 마찬가지로 지원 끝에서 온라인 고객 만 볼 수 있으며 다른 지원 담당자는 볼 수 없습니다. 나는 이것을 봤고 구현하는 가장 좋은 방법은 groupA (지원자)의 사용자가 groupB (클라이언트)의 온라인 사용자 만 볼 수 있고 groupB의 사용자는 groupA의 온라인 사용자 만 볼 수 있도록 그룹을 사용하는 것임을 알았습니다. 내 자바 스크립트시그널러 그룹 구현하기

`# 지역 --- 방법 ---

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); 
    } 
} 

}`:

이 내 허브 클래스 방송의 경우

$.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); 

이 코드 샘플이 SO 질문에서 찍은? 너는 무엇을 알기를 원하느냐? –

+0

그룹 A가 그룹 B의 온라인 사용자를 조회하고 그 반대의 경우, 즉 다른 그룹의 사용자는 자신의 그룹에있는 사용자를 볼 수 없도록 그룹 2를 구현하는 방법을 알고 싶습니다. – Trev

답변