【问题标题】:How to send events/messages to specific clients in node.js using Socket.io?如何使用 Socket.io 向 node.js 中的特定客户端发送事件/消息?
【发布时间】:2019-06-19 07:18:39
【问题描述】:

我正在开发一个 Node.js 应用程序,我们在其中使用 socket.io 向客户端发送和接收事件/消息。最初它使用以下语句向客户端发送事件。

io.sockets.emit('SequenceLoad', data);

但现在我只想使用客户端特定的套接字将事件发送给特定的客户端。我对此进行了很多搜索,找到了一些方法,但似乎都没有,在各种 SO 帖子中都可以找到。

这是我尝试过的代码:

const io = require('socket.io')(http);
var socketsCollection = [];
io.on('connection', function (socket) {

  //Saving socket id's for sending events to specific sockets based on their ids
  socketsCollection.push(socket.id);
  socket.on('SequenceLoadServer', function (data) {
     // logger.info('Socket Server | Event: sequenceLoadServer with socket server. \n Data:'+ data);
     console.log("In APP.js for SequenceLoadServer event");
     console.log("Socket Id :" + socket.id);
     var socketId = null;
     setTimeout(function () {
        for (var item of socketsCollection) {
           if(item == socket.id){
              socketId= item;
              break;   
           }
        }
        console.log("Socket after searching Id :" + socketId);
        io.sockets.emit('SequenceLoad', data);   -> This works at the moment

        //Tried the following ways as well but none of them worked 

        //io.sockets.connected[socketId].emit('SequenceLoad', data);
        //io.sockets.socket(socketId).emit('SequenceLoad', data); 
        //io.to(socketId).emit('SequenceLoad', data);
        //io.to('/#' + socketId).emit('SequenceLoad', data);
        //io.to(`${socketId}`).emit('SequenceLoad', data);

     }, 1000 * 3);

  });
}

我项目中的socket.io版本:

"socket.io": "^2.2.0",
"socket.io-client": "^2.2.0"

任何帮助都会很好,如果我做错了,请纠正我,因为我是新手。谢谢

【问题讨论】:

  • 你想如何选择一个特定的socket/client?通过其id?
  • @NickParsons 是的

标签: javascript node.js socket.io


【解决方案1】:

鉴于您有套接字实例,您可以通过以下方式直接发送到特定客户端:

io.to(`${socket.id}`).emit(...);

见Emit cheatsheet

【讨论】:

  • 您可以在我的帖子中看到我已经在这样做但它不起作用。
  • @Harry.Naeem 这并不意味着这不是正确的方法 - 你也仔细看过我的答案吗?我没有使用您从数组中获取的 ID,而是直接使用 socket.id(由于闭包的工作方式,这将是相同的差异)。我认为问题在于您的循环/ID 获取没有给您正确的 ID,请尝试直接使用 socket.id,我完全希望它能够正常工作。
  • 我没有说这是错误的方式,但我已经尝试过了。我的循环为我提供了我保存的正确 ID,并且我在发出数据之前使用日志来查看套接字 ID。但无论如何我也会看看它
  • 是的,我试过这个东西,但还是不行
猜你喜欢
  • 2012-05-24
  • 2011-06-06
  • 2015-08-06
  • 1970-01-01
  • 2011-10-18
  • 2015-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多