如何使用Socket.io将事件/消息发送到node.js中的特定客户端?

时间:2019-06-19 07:18:39

标签: javascript node.js socket.io

我正在开发一个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"

如果我做错了什么,因为我是新来的,所以任何帮助都会很棒,请纠正我。谢谢

2 个答案:

答案 0 :(得分:0)

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

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

请参见Emit cheatsheet

答案 1 :(得分:0)

您可以保持所有套接字连接的对象,其中键是套接字的<dependency> <groupId>com.jcraft</groupId> <artifactId>jsch</artifactId> <version>0.1.42</version> </dependency> ,值可以是<dependency> <groupId>com.jcraft</groupId> <artifactId>jsch</artifactId> <version>0.1.54</version> </dependency> 本身:

id