Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.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 如何避免在html页面刷新后在socket.io中创建新的套接字连接?_Node.js_Real Time_Socket.io - Fatal编程技术网

Node.js 如何避免在html页面刷新后在socket.io中创建新的套接字连接?

Node.js 如何避免在html页面刷新后在socket.io中创建新的套接字连接?,node.js,real-time,socket.io,Node.js,Real Time,Socket.io,我尝试过socket.io,我发现当客户端html页面加载时,创建了一个新的套接字连接。当我刷新页面时,我发现创建了一个新的套接字连接,然后断开了旧的连接 我的问题是如何避免这种情况?因为我正在构建一个聊天室应用程序。当用户进入房间页面时,在“连接”服务器端发出“欢迎用户xxx来!”,在“DISCONEC”事件中发出“用户xxx离开”。但当用户刷新当前页面时,将再次触发“断开连接”事件和“连接”事件。它会同时发出“欢迎用户xxx来!”和“用户xxx离开”的消息 如何忽略页面刷新事件?就像http

我尝试过socket.io,我发现当客户端html页面加载时,创建了一个新的套接字连接。当我刷新页面时,我发现创建了一个新的套接字连接,然后断开了旧的连接

我的问题是如何避免这种情况?因为我正在构建一个聊天室应用程序。当用户进入房间页面时,在“连接”服务器端发出“欢迎用户xxx来!”,在“DISCONEC”事件中发出“用户xxx离开”。但当用户刷新当前页面时,将再次触发“断开连接”事件和“连接”事件。它会同时发出“欢迎用户xxx来!”和“用户xxx离开”的消息

如何忽略页面刷新事件?就像http会话一样



更新:我已经找到了解决问题的方法。从这个问题来看

您无法阻止刷新页面,也无法避免用户刷新页面时socket.io断开连接

我建议添加一个超时:

  • 当看到用户正在断开连接时,启动计时器,例如10-30秒
  • 如果用户在计时器尚未结束时返回聊天室,请不要执行任何操作
  • 如果用户在计时器结束后未返回,则显示“用户已离开”消息

    • 您可以使用会话。即使在刷新时套接字断开连接,您仍然可以保留该特定用户的一些数据,并在再次连接套接字时使用这些数据

      以下是您如何使用会话:

      var express = require('express');     
      var MemoryStore = require('express').session.MemoryStore;
      
      app.use(express.cookieParser());
      app.use(express.session({ secret: "keyboard cat", store: new MemoryStore({ reapInterval: 60000 * 10 })}));
      
      app.get('/', function(req,res){
          req.session.name ="clients_name";
          res.render(__dirname + '/index.jade',{user:req.session.name});
      });
      

      您应该使用jade或任何其他“查看引擎”将数据传递到页面。

      对于这个问题有“类似会话”的解决方案吗?我真的不知道您的意思。。客户端的套接字在浏览器中,当重新加载页面时,该页面的所有客户端JS代码和状态基本上都会被丢弃。您能为此提供伪代码吗?我有点困惑,在这里找到了一个可能的解决方案: