socket.io 1.0.0 ^: использование комнаты по умолчанию и настраиваемой комнаты для взаимодействия с пользователем.

socket.io 1.4.5, node.js 5.x

Вперед: перед этим постом было много чтения, усилий и неудач - так что я надеюсь, что он поможет многим будущим читателям.


Возможность использования комнаты по умолчанию смутила меня, когда я задумываюсь о том, как использовать комнаты для общения с конкретными пользователями (например, прямое сообщение).

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

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

Что привело мою должную осмотрительность к созданию этого решения:

io.on('connection', function(socket){
  var curretUserID = null

  socket.on('set user',function(user){
    userID = curretUserID.id
  });

  io.to(socket.id).emit('welcome','welcome to the room!)

  socket.on('chat message', function(msg){//Makes Sense
    io.emit('chat message', msg);
  });

  socket.on('private message', function(id, msgData){
    if(userID === msg.recipientID){
        socket.to(id).emit('private message', 'for your eyes only');
    }
  });

});

Я установил userID жить внутри родительской области connection, чтобы избежать необходимости создавать карту между пользователями и сокетами, потому что якобы это должно быть преимуществом использования решения для комнаты в целом.

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

Вопрос:

Является ли это одним из предполагаемых вариантов использования комнаты по умолчанию или создание настраиваемой комнаты (как в популярном ответе, упомянутом выше) по-прежнему является текущим способом обработки сообщений, специфичных для пользователя?


person Nick Pineda    schedule 10.02.2016    source источник


Ответы (1)


Непросто понять вашу настоящую проблему, особенно если смешать все переменные ... Но я постараюсь ответить на ваш вопрос.

Я думаю, что проблема кроется в идентификаторах сокетов на стороне сервера. Socket.io добавляет пространство имен к каждому socket.id. Допустим, ваш socket.id на стороне клиента - это 4zIISeXsSvKL6VGyAABe, а на стороне сервера - /#4zIISeXsSvKL6VGyAABe.

Я надеюсь, что команда socket.io исправит эту проблему, потому что они также создали ее в недавнем выпуске.

Как я это исправляю, я обновляю user.id на стороне клиента после подключения.

Сервер:

io.on('connection', function(socket) {
  socket.emit('register id', socket.id)
}

Клиент:

socket.on('register id', function(id){
  socket.id = id
})

Затем личное сообщение может быть отправлено следующим образом

Сервер:

io.on('connection', function(
  socket.emit('register id', socket.id)

  io.to(socket.id).emit('welcome','welcome to the room!)

  socket.on('chat message', function(msg){//Makes Sense
    io.emit('chat message', msg);
  });

  socket.on('private message', function(msgData){
        socket.to(msg.recipientID).emit('private message', 'for your eyes only');
  });

});
person Karolis Šinas    schedule 22.11.2016
comment
Обратите внимание, что начиная с версии 1.5.0 (и этого PR) сокет .id на стороне сервера в пространстве имен по умолчанию (/) также будет 4zIISeXsSvKL6VGyAABe. - person darrachequesne; 23.11.2016