Как реализовать отправку сообщений некоторым пользователям не на все сокеты - PullRequest
0 голосов
/ 08 мая 2019

Как вместо этого отправить сообщение всем клиентам в комнате, конкретному пользователю в комнате по умолчанию на основе имени пользователя или идентификатора.Где мне нужно это реализовать, только на сайте сервера или?Я знаю, что я делаю неправильно, и я в замешательстве.

var numUsers = 0;

io.on('connection', (socket) => {
  var addedUser = false;

  // when the client emits 'new message', this listens and executes
  socket.on('new message', (data) => {
    // we tell the client to execute 'new message'
    socket.broadcast.emit('new message', {
      username: socket.username,
      message: data
    });
  });

Я вижу в документах этот код https://socket.io/docs/rooms-and-namespaces/ и как я могу обрабатывать идентификаторы пользователей, они менялись при каждом повторном соединении

Ответы [ 2 ]

1 голос
/ 08 мая 2019

Вот что вы можете сделать:

1.Вы можете использовать свою собственную структуру данных для хранения пользовательской информации, такой как socketId и других вещей, или перейти на redis, это хорошо в структуре данных памяти.

2.Вы должны хранить socketId для каждого пользователя, когда на сервере устанавливается новое соединение, используя любой из вышеперечисленных или каким-либо другим способом.

3. когда вы хотите отправить сообщение определенному пользователю, вам нужен его socketId и использовать этот код для отправки сообщения:

 io.to(`${socketId}`).emit('hey', 'How are you');

4.При отключении пользователя просто удалите информацию пользователя, такую ​​как socketId, и другую имеющуюся информацию.

Итак, когда пользователь присоединяется к вашему серверу, сохраняйте его информацию, а когда он уходит, просто удаляете ее.

Теперь предположим, что к вашему серверу подключено четыре пользователя. просто создайте массив объектов для отслеживания пользователей и идентификаторов сокетов. когда новый пользователь подключается, просто вставьте массив, а когда пользователь завершит работу, просто выполните цикл по массиву, а при совпадении socketId просто удалите этот объект из массива, просто

 let users = [{name:'a',id:'socketId'},{name:'b',id:'socketId'},{name:'c',id:'socketId'},{name:'d',id:'socketId'}]

если вы хотите отправить сообщение пользователю b, просто выполните цикл по массиву и сопоставьте свойство name, а когда найдете подходящее имя, просто извлеките идентификатор этого пользователя и отправьте его

for(let i=0 ; i<users.length ; i++){
     if(users[i].name == 'b'){
        io.to(users[i].id).emit('hey', 'How are you');
     }
}
0 голосов
/ 10 мая 2019

Каждое соединение имеет идентификатор сокета, но оно будет отличаться каждый раз, когда пользователь открывает новую вкладку в браузере. Поэтому, если пользователь откроет две вкладки, у них будет два разных идентификатора сокета.

Так что лучшим подходом будет использование комнат. Каждый раз, когда пользователь подключается, вы можете добавить его в комнату. Имя комнаты может быть идентификатором пользователя или электронной почтой.

socket.join(userid)

Затем, когда вы хотите отправить сообщение конкретному пользователю, просто используйте

io.sockets.in(userid).emit('message',"hello");

Это будет работать, даже если у пользователя на устройстве открыто несколько вкладок.

...