我正在使用插座。io和node.js,到目前为止,它似乎很好,但我不知道如何从服务器发送消息到特定的客户端,就像这样:

client.send(message, receiverSessionId)

但是.send()和.broadcast()方法似乎都不能满足我的需要。

我发现了一个可能的解决方案,是.broadcast()方法接受作为第二个参数的sessionid数组,不发送消息,所以我可以传递一个数组与所有的sessionid连接到服务器,除了一个我希望发送消息,但我觉得必须有一个更好的解决方案。

什么好主意吗?


当前回答

好吧,你必须抓住客户(惊喜),你可以选择简单的方法:

var io = io.listen(server);
io.clients[sessionID].send()

它可能会坏,我怀疑,但总是有可能io。客户端可能会被更改,因此请谨慎使用上述方法

或者您自己跟踪客户端,因此您将它们添加到连接侦听器中自己的客户端对象中,并在断开连接侦听器中删除它们。

我将使用后者,因为根据应用程序的不同,您可能希望在客户机上有更多的状态,因此可以使用类似clients[id] = {conn: clientConnect, data:{…}}可能会起作用。

其他回答

你也可以保留客户的参考资料。但这会让你的记忆很忙。

创建一个空对象并将客户端设置在其中。

const myClientList = {};

  server.on("connection", (socket) => {
    console.info(`Client connected [id=${socket.id}]`);
     myClientList[socket.id] = socket;   
  });
  socket.on("disconnect", (socket) => {
    delete myClientList[socket.id];
  });

然后通过对象中的id调用特定的客户端

myClientList[specificId].emit("blabla","somedata");

不管我们使用的是什么版本,如果我们只是console.log()我们在服务器端nodejs代码中使用的“io”对象,[例如io. log]在('connection', function(socket){…});]上,我们可以看到"io"只是一个json对象,有许多子对象存储套接字id和套接字对象。

我正在使用socket。顺便说一句,IO版本1.3.5。

如果我们查看io对象,它包含,

 sockets:
  { name: '/',
    server: [Circular],
    sockets: [ [Object], [Object] ],
    connected:
     { B5AC9w0sYmOGWe4fAAAA: [Object],
       'hWzf97fmU-TIwwzWAAAB': [Object] },

在这里我们可以看到套接字“B5AC9w0sYmOGWe4fAAAA”等。所以,我们可以,

io.sockets.connected[socketid].emit();

再进一步观察,我们可以看到这样的片段,

 eio:
  { clients:
     { B5AC9w0sYmOGWe4fAAAA: [Object],
       'hWzf97fmU-TIwwzWAAAB': [Object] },

我们可以从这里通过

io.eio.clients[socketid].emit();

在引擎下,

engine:
 { clients:
    { B5AC9w0sYmOGWe4fAAAA: [Object],
      'hWzf97fmU-TIwwzWAAAB': [Object] },

所以,我们也可以这样写,

io.engine.clients[socketid].emit();

所以,我想我们可以用上面列出的三种方法中的任何一种来实现我们的目标,

io.sockets.connected [socketid] .emit (); 或 io.eio.clients [socketid] .emit (); 或 io.engine.clients [socketid] .emit ();

Io.sockets.sockets [socket.id].emit(…)在v0.9中为我工作

从1.4.5版本开始,请确保在io.to()中提供了一个正确前缀的socketId。 我把socketId客户端日志调试,它没有前缀,所以我最终永远搜索,直到我发现!所以如果Id没有前缀,你可能需要这样做:

io.to('/#' + socketId).emit('myevent', {foo: 'bar'});

好吧,你必须抓住客户(惊喜),你可以选择简单的方法:

var io = io.listen(server);
io.clients[sessionID].send()

它可能会坏,我怀疑,但总是有可能io。客户端可能会被更改,因此请谨慎使用上述方法

或者您自己跟踪客户端,因此您将它们添加到连接侦听器中自己的客户端对象中,并在断开连接侦听器中删除它们。

我将使用后者,因为根据应用程序的不同,您可能希望在客户机上有更多的状态,因此可以使用类似clients[id] = {conn: clientConnect, data:{…}}可能会起作用。