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

client.send(message, receiverSessionId)

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

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

什么好主意吗?


当前回答

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

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

其他回答

你可以使用

//只向sender-client发送消息

套接字。Emit ('message', 'check this');

//或者你可以发送给所有的监听器,包括发送者

io。Emit ('message', 'check this');

//发送给除发送方之外的所有侦听器

socket.broadcast。Emit ('message', 'this is a message');

//或者你可以把它送到一个房间

socket.broadcast.to(“聊天室”)。Emit ('message', '这是给所有人的消息');

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

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");

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

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

套接字。IO允许您为套接字“命名空间”,这本质上意味着分配不同的端点或路径。

这可能会有帮助: http://socket.io/docs/rooms-and-namespaces/