2016-10-20 4 views
0

Я пытаюсь создать функцию 'seen' для моего чата socket.io. Для этого мне нужно знать, в какой комнате находится клиент-получатель. Как я могу это сделать? Например, если пользователь отправляет сообщение группе, я хочу проверить текущую комнату пользователя в этой группе, а затем сказать, находятся ли они в этой комнате или нет.Проверьте, в какой комнате указан указанный клиентский сокет io

+0

Если вы пытаетесь сделать это с сервера, то в этом ответе будет указан точный код: [Как я могу получить имя комнаты сокета в socket 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; 
} 

Что-то вроде выше. Я уверен, что вы могли бы его оптимизировать, но это все дело.