Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 持久化NodeJS套接字_Node.js_Sockets - Fatal编程技术网

Node.js 持久化NodeJS套接字

Node.js 持久化NodeJS套接字,node.js,sockets,Node.js,Sockets,你好,社区, 因为那天早上我遇到了一个想法,不想说我想存储客户机(套接字)的问题,以便以后重新调用它们,我知道现在还不太清楚,我将详细解释: 首先,我有一个服务器接口(ServerSocket)net.server(),它将接收客户端(sockets)net.Socket(),这个接口将存储在一个Map()中,每个客户端都有一个唯一的ID,每次我想与其中一个客户端通信时,我都会调用Map.get(ID)。write。。。或其他功能 一切正常,直到我关闭服务器,自动套接字将被杀死。。。我已经找到了

你好,社区, 因为那天早上我遇到了一个想法,不想说我想存储客户机(套接字)的问题,以便以后重新调用它们,我知道现在还不太清楚,我将详细解释:

首先,我有一个服务器接口(ServerSocket)
net.server()
,它将接收客户端(sockets)
net.Socket()
,这个接口将存储在一个Map()中,每个客户端都有一个唯一的ID,每次我想与其中一个客户端通信时,我都会调用Map.get(ID)。write。。。或其他功能

一切正常,直到我关闭服务器,自动套接字将被杀死。。。我已经找到了一个解决方案来存储我的案例(vuex)或本地存储的客户机,以简化我所需要的,就是当我重新启动服务器并调用其中一个客户机时,它将始终处于活动状态。 所以我的主要问题是:

  • 服务器关闭后,如何使客户端保持活动状态
  • 如何存储套接字并在重新启动服务器后检查它们是否处于活动状态
服务器关闭后,如何使客户端保持活动状态

客户端无法保持与未运行的服务器的连接。当服务器关闭时,客户机可以自由地自己做任何事情,但它无法保持与已关闭服务器的连接。“连接”的整个定义是在两个活动端点之间

如何存储套接字并在重新启动服务器后检查它们是否处于活动状态

服务器停机时,无法存储套接字。套接字是实时连接、TCP状态等的操作系统表示形式。。。当服务器关闭然后重新启动时,上一个套接字将消失。如果它在关闭之前没有被服务器关闭,那么当服务器进程关闭时,它会被操作系统清除。它不见了


我建议你在这里要求的东西是错误的。套接字不会超过其进程,并且在连接的一端断开时也不会保持活动状态

相反,通常的架构是自动重新连接。当客户端收到服务器不再存在的通知时,客户端将尝试在某个时间间隔重新连接。当服务器在未来某个时间再次启动时,客户端可以重新连接到服务器并重新建立连接

如果连接启动的一部分是某种clientID的交换,那么客户端可以重新连接,显示它的标识符,服务器可以准确地知道它是哪一个客户端,然后使用新的套接字连接,事情可以像以前一样继续,但其他一切都在进行,就好像以前的套接字连接从未关闭一样。当客户端重新连接时,您只需在服务器上重建映射对象


出于可扩展性的原因,您的客户端通常会实施某种退避(通常会添加一些随机抖动),这样当您的服务器重新联机时,它不会立即受到数百个客户端的攻击,所有客户端都试图在同一时刻连接。

感谢您的回复,所以我应该在客户端的sockets部分添加一个新的理念,说它是一个由我应该添加keepAlive的每个客户端启动的js文件?或者是一个无限循环?@SalahEddineBentayeb-您可以看到socket.io库在这方面做了什么。首先,它们监视表示断开连接的所有事件。其次,他们向另一端发送一个ping数据包,并期望在一定时间内得到pong响应。如果他们没有看到监控数据包的正确乒乓模式,那么套接字就没有关闭就死掉了。当这些错误事件发生时,它们会关闭当前套接字并尝试重新建立一个新的套接字。如果重建没有立即成功,那么他们会启动重试计时器并继续尝试。
 var net = require("net");
 var server = new net.Server();
 var sockets = new Map();
    
    /**
     * This events is called when server is successfully listened.
     */
    server.on("listening", () => {
      console.log("Server Listen in port 4444");
    });
    
    /**
     * This events is called when error occur in server
     */
    server.on("error", (e) => {
      if (e.code === "EADDRINUSE") {
        console.log("Address in use, retrying...");
      }
    });
    
    /**
     * This events is called when a new client is connected to server.
     */
    server.on("connection", (socket) => {
      var alreadyExist = false;
      sockets.forEach((soc) => {
        if (soc.remoteAddress === socket.remoteAddress) {
          alreadyExist = true;
        }
      });
      if (alreadyExist) {
        socket.end();
      } else {
        socket.setKeepAlive(true, Infinity);
        socket.setDefaultEncoding("utf8");
        socket.id = nanoid(10);
        sockets.set(socket.id, socket);
    
        socket.on("error", (e) => {
          console.log(e);
          if (e.code === "ECONNRESET") {
            console.log("Socket end shell with CTRL+C");
            console.log("DEL[ERROR]: " + socket.id);
          }
        });
    
        socket.on("close", () => {
          console.log("DEL[CLOSE]: " + socket.id);
        });
    
        socket.on("end", () => {
          console.log("DEL[END]: " + socket.id);
        });
    
        socket.on("timeout", () => {
          console.log("timeout !");
        });
    
        var child = sockets.get(res.id);
        child.write(/* HERE I SEND COMMAND NOT IMPORTANT ! */);
    
        socket.on("data", (data) => {
          console.log("Received data from socket " + data);
        });
      }
    });