io.on('connection')事件是否需要将数据发送到预先存在且已连接的套接字?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了io.on('connection')事件是否需要将数据发送到预先存在且已连接的套接字?相关的知识,希望对你有一定的参考价值。

我有2个Nodejs Server脚本运行,即:StudentServer和AdminServer,它们位于同一IP上的不同端口上。

我有一个连接的套接字ID(假设它是SCKT-X0)保存在StudentServer中检索的数据库中。从StudentServer通过SCKT-X0进行通信没有问题。

StudentServer已注册到事件:io.on('connection'),因为它实时服务于客户端并且它完全正常工作。 AdminServer没有io.on('connection')事件。

我正在尝试使用以下代码从AdminServer通过SCKT-X0推送数据:

if (io.sockets.connected[client.id]){
    io.to(client.id).emit("event", {"data": data});
}else{
    console.log("Client not connected");
}

结论:client.id是SCKT-X0,它是连接的,因为它从StudentServer接收数据而没有任何Socket ID的变化。但是当上面的代码运行时,它会从AdminServer输出Client not connected

所以我的问题是:

  1. 我是否需要注册io.on('connection')事件以与预先存在且已连接的套接字ID(在另一台服务器中检索)进行通信?
  2. 如果问题1的答案是肯定的,那么socketIO是否为不同的服务器引用具有相同SocketID的不同客户端?
答案

这是socket.io特定的问题,这可能会改变,但io.on('connection')是一种机制,表明某些客户端已连接。要回答1号,是管理服务器需要它将数据推送到其所有客户端。把它想象成观察者模式。如果SCKT-X0未注册为连接到AdminServer,则即使您拥有该ID,也不会将其推送到客户端。

您需要像Redis Server这样的东西在不同的服务器上共享它。幸运的是,socket.io已经有了一个适配器

https://github.com/socketio/socket.io-redis

以上是关于io.on('connection')事件是否需要将数据发送到预先存在且已连接的套接字?的主要内容,如果未能解决你的问题,请参考以下文章

如何删除 io.on('connection') 监听器?

socket.io |我应该将路由处理程序包装在 io.on('connection') 中吗?

socket.io:为啥这个广播语句不起作用?

有啥不同? .on“连接”与 .on“连接”

解决 ('Connection aborted.', ConnectionResetError(54, 'Connection reset by peer')) 问题(

QTerror: 'connect'/'sender' was not declared in this scope