socket.io 发送到默认房间不起作用

socket.io emit to default room does not work

当我在没有 io.emit() 的情况下调用 emit 时,所有连接的客户端都会收到您期望的消息。但是,当尝试使用 io.to(socket.id).emit() 向默认房间发送消息时,客户端收不到消息。

参考默认房间文档 http://socket.io/docs/rooms-and-namespaces/#default-room

使用 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);
});

这是正确的解决方案。发现服务器用来设置默认房间的默认房间socket.id与客户端socket.id不一样。请指教

客户端 如果你评估 socket.id 你会得到类似 v4eEdSX5RnDSXjzuAAAA

服务器 中,io.on('connection', function(socket){}) 如果你评估 socket.id 你会得到类似 /#v4eEdSX5RnDSXjzuAAAA 的东西。 注意客户端 socket.id.

前面的 /#

所以你有两种方法可以解决这个问题

  1. 调用 emit 时将 /# 添加到套接字 ID
  2. 覆盖 io "connection" 侦听器以将房间设置为没有 /# 前缀的套接字 ID

选择的选项二如下:

io.on('connection', function(socket) {
  socketID = socket.client.id;
  socket.join(socketID);
  console.log('a user connected ' + socketID);
});