2016-10-20 5 views
0

私のsocket.ioチャットに「見た」機能を作ろうとしています。そのためには、どの部屋が受信側のクライアントであるかを知る必要があります。これを行うにはどうすればよいですか?ユーザーがグループにメッセージを送信した場合の例グループからすべてのユーザーの現在のルームを確認し、そのユーザーがこのルームにいるかどうかを確認します。指定されたクライアントソケットがどの部屋に入っているか確認してください。

+0

サーバーからこれを実行しようとしている場合、正確なコードはこの回答にあります:[ソケット1.4でソケットルーム名を取得する方法は?](http://stackoverflow.com/questions/39836410/どのようにしてソケットソケット名をソケットにするか1-4/39836710#39836710)。 – jfriend00

+0

これをクライアントから実行しようとしている場合、できません。どの部屋がクライアントに要求されたのかを何らかの形で追跡しない限り、サーバーだけがソケットがある部屋を知っているので、サーバーに尋ねる必要があります。サーバーのみが部屋からソケットを追加/削除できます。 – jfriend00

答えて

0

私がこれを行う方法は、サーバー上の接続されたソケットの一覧を維持し、接続時に追加します(ただし重複を確認します)。 socket.roomsを使用すると、ソケットがどの部屋に含まれているかを確認できます。ユーザーは複数の部屋にも参加できるので、iirc、socket.roomsは多種多様な配列やコレクションです。

以下のコードを使用すると、リクエストしているソケットと部屋を共有するユーザーの一覧を取得できます。

var connected_sockets = []; 

io.on("connection",function(socket){ 
    socket.on("request", function(msg){ 
     var socket = get_user_connection(socket.id); 
     if(socket == null){ 
      connected_sockets.push(socket); //add if not already 
     } 
     var users_in_same_room = []; 
     for(var x = 0; x < socket.rooms.length; x++){ 
      for(var y = 0 ; y < connected_sockets.length; y++){ 
       if(connected_sockets[y].id == socket.id) continue; 
       if(is_user_in_room(connected_sockets[y],socket.rooms[x])){ 
        //they share a room 
        users_in_same_room.push(connected_sockets[y]); 
       } else { 
        //they do not share a room 
       } 
      } 
     } 
    } 
}); 

var get_user_connection = function(socket_id){ 
    for(var x = 0 ; x < connected_sockets; x++){ 
     if(connected_sockets[x].id == socket_id){ 
      return connected_sockets[x]; 
     } 
    } 
    return null; 
} 

var is_user_in_room = function(socket,room_name){ 
    for(var x = 0 ; x < connected_sockets[x].rooms.length; x++){ 
     if(connected_sockets[x].rooms[y] == room_name){ 
      return true; 
     } 
    } 
    return false; 
} 

上記のようなものです。私はあなたがそれを最適化できると確信していますが、それは物事のジストです。

関連する問題