2017-04-04 1 views
2

허브에 연결된 클라이언트가 여러 개인 경우 JavaScript를 사용하여 클라이언트 측 (.aspx)에서 연결된 클라이언트의 세부 정보를 얻는 방법은 무엇입니까?
SendChatMessage() 메서드에서 클라이언트 측 (.aspx)에서 "who"매개 변수를 전달해야하지만 너무 많은 연결된 클라이언트 중 특정 클라이언트의 연결 ID 또는 사용자 이름을 알 수있는 방법은 무엇입니까? 특정 클라이언트에 메시지를 전송하는 동안SignalR을 사용하여 특정 클라이언트에게 메시지를 보내는 방법

public class Chathub : Hub 
{ 
    private readonly static ConnectionMapping<string> _connections = 
     new ConnectionMapping<string>(); 

    public void SendChatMessage(string who, string message) 
    { 
     string name = Context.User.Identity.Name; 

     foreach (var connectionId in _connections.GetConnections(who)) 
     { 
      Clients.Client(connectionId).addChatMessage(name + ": "message); 
     } 
    } 

    public override Task OnConnected() 
    { 
     string name = Context.User.Identity.Name; 
     _connections.Add(name, Context.ConnectionId); 
     return base.OnConnected(); 
    } 


public class ConnectionMapping<T> 
{ 
    private readonly Dictionary<T, HashSet<string>> _connections = 
     new Dictionary<T, HashSet<string>>(); 

    public int Count 
    { 
     get 
     { 
      return _connections.Count; 
     } 
    } 

    public void Add(T key, string connectionId) 
    { 
     lock (_connections) 
     { 
      HashSet<string> connections; 
      if (!_connections.TryGetValue(key, out connections)) 
      { 
       connections = new HashSet<string>(); 
       _connections.Add(key, connections); 
      } 

      lock (connections) 
      { 
       connections.Add(connectionId); 
      } 
     } 
    } 

    public IEnumerable<string> GetConnections(T key) 
    { 
     HashSet<string> connections; 
     if (_connections.TryGetValue(key, out connections)) 
     { 
      return connections; 
     } 

     return Enumerable.Empty<string>(); 
    } 
+1

이 질문에 C# 태그를 추가하면 안됩니까? 그것은 자바 스크립트보다 더 많은 관련이있는 것으로 보인다. – evolutionxbox

답변

0

, 당신은 채팅을 업데이트,이 클라이언트 방법입니다

public void SendPrivateMessage(string toUserId, string message) 
     { 

      string fromUserId = Context.ConnectionId; 

      var toUser = ConnectedUsers.FirstOrDefault(x => x.ConnectionId == toUserId) ; 
      var fromUser = ConnectedUsers.FirstOrDefault(x => x.ConnectionId == fromUserId); 

      if (toUser != null && fromUser!=null) 
      { 
       // send to 
       Clients.Client(toUserId).sendMessage(fromUserId, fromUser.UserName, message); 

       // send to caller user as well to update caller chat 
       Clients.Caller.sendMessage(toUserId, fromUser.UserName, message); 
      } 

     } 

Clients.Caller.sendMessage(toUserId, fromUser.UserName, message); 참고 클라이언트에서 chathub.server.sendMessage()를 호출해야합니다. 클라이언트 측에서 다음

, 당신은 당신이 jQuery를 사용할 필요가 ID를 얻으려면 그 specific userid을 통과 할 수있는 예는 먼저 클라이언트 측에서 각 클라이언트의 ID를 저장해야, chathub.server.sendMessage(id,msg) 전화는 말할 수

<a id='userid' class="username"></a> 

와 클릭 이벤트에 당신은

$("a").on('click',function(){ 

    var touser = $(this).attr('id')) 
    } 

chathub.server.sendMeassage(touser,msg); 

이 수도가 아닌 완벽한 솔루션처럼 해당 사용자의 id을 얻을 수 있지만, 당신이해야 할 이렇게.

아이디어를 보여주는 좋은 게시물 here이 있습니다.

+0

SendChatMessage() 메서드에서 클라이언트 측의 매개 변수로 "who"대신 전달할 내용. "누가"키를 가진 ConnectionId를 찾는 데 사용되는 내 사전 (연결된 클라이언트의 세부 정보가 들어있는 사전)의 키로 작동한다고 생각합니다. –

+0

편집을 확인하려면이 작업을 구현해야합니다. 요구 사항. – MUT