【问题标题】:socket.io emit to default room does not worksocket.io 发射到默认房间不起作用
【发布时间】:2016-12-21 03:42:57
【问题描述】:

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

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

使用nodejsv4.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.io 中工作得很好,很明显这必须与您的代码有关。关于代码的问题必须包括相关代码。如果您不包含代码,我们如何知道您在代码中做错了什么?
  • 谢谢@jfriend00,我认为你的建议会对我的发现产生很大的影响。

标签: socket.io socket.io-1.0


【解决方案1】:

这是正确的解决方案。发现服务器用来设置默认房间的默认房间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);
});

【讨论】:

  • socket id 被用作默认房间而无法将其配置为关闭,这很愚蠢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-01
  • 1970-01-01
  • 2018-05-07
  • 1970-01-01
  • 2017-01-03
  • 2013-07-12
  • 1970-01-01
相关资源
最近更新 更多