Я пытаюсь создать функцию 'seen' для моего чата socket.io. Для этого мне нужно знать, в какой комнате находится клиент-получатель. Как я могу это сделать? Например, если пользователь отправляет сообщение группе, я хочу проверить текущую комнату пользователя в этой группе, а затем сказать, находятся ли они в этой комнате или нет.Проверьте, в какой комнате указан указанный клиентский сокет io
0
A
ответ
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;
}
Что-то вроде выше. Я уверен, что вы могли бы его оптимизировать, но это все дело.
Если вы пытаетесь сделать это с сервера, то в этом ответе будет указан точный код: [Как я могу получить имя комнаты сокета в socket 1.4?] (Http://stackoverflow.com/questions/39836410/ как-могу-я-получить сокет-номер-имя-в-розетки-1-4/39836710 # 39836710). – jfriend00
Если вы пытаетесь сделать это с клиента, вы не сможете. Вы должны спросить сервер, потому что только сервер знает, в каких комнатах находится сокет, если вы каким-то образом не отслеживаете, какие номера вы запросили на клиенте. Только серверы могут добавлять/удалять сокет из комнаты. – jfriend00