socket.io излучение в комнату по умолчанию не работает

Когда я вызываю emit без io.emit(), все подключенные клиенты получают сообщение, как вы ожидаете. Однако при попытке отправить сообщение в комнату по умолчанию с помощью io.to (socket.id).emit () клиент не получает сообщение.

Ссылка на документацию комнаты по умолчанию на http://socket.io/docs/rooms-and-namespaces/

Использование nodejs v4.2.6

Клиент:

var socket = io();
socket.on('connect', function() {
  $.ajax({
    url: '/some-path',
    type: 'POST',
    data: {socket_id: socket.id},
    success: function(data) {
      console.log(data);
    }
  });
});   

Сервер:

app.post('/some-path', function(req, res) {
  var socketID = req.body.socket_id;
  io.to(socketID).emit('message', {'message': socketID});
  res.end(socketID);
});

1 ответ

Решение

Это правильное решение. Было обнаружено, что номер комнаты socket.id по умолчанию, который используется сервером для установки комнаты по умолчанию, не совпадает с клиентским socket.id. Пожалуйста, порекомендуйте.

На клиенте, если вы оцениваете socket.id вы получаете что-то вроде, v4eEdSX5RnDSXjzuAAAA

На сервере в, io.on('connection', function(socket){}) если вы оцениваете socket.id вы получите что-то вроде, /#v4eEdSX5RnDSXjzuAAAA, Обратите внимание на /# перед клиентским socket.id.

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

  1. При звонке выбрасывать prepend /# к идентификатору сокета
  2. Переопределите прослушиватель io "connection", чтобы установить для комнаты идентификатор сокета без /# указывая префикс

Выбранный второй вариант выглядит следующим образом:

io.on('connection', function(socket) {
  socketID = socket.client.id;
  socket.join(socketID);
  console.log('a user connected ' + socketID);
});
Другие вопросы по тегам