node.js - Node : Distinguish between a reload event and a browser exit with socket event

标签 node.js sockets websocket socket.io

我想在套接字关闭时运行一些代码,但前提是用户没有重新加载页面...

我有类似的东西

socket.on("close", function() {
//do something here
});

问题是这个函数也在重新加载事件期间运行...我可以以某种方式暂停它以便稍后使用当时的值运行吗?我尝试在回调中使用设置的超时,但无法再从回调中访问套接字对象。

如果套接字连接不久后重新获得,阻止该函数运行的最佳方法是什么?

最佳答案

我的想法的主要概念是,你永远不会知道用户正在重新加载或断开连接,并且在 1 天左右的时间内不会再回来,有一些方法可以检测浏览器正在离开网站,但无法知道(在服务器端)它将转到相同的地址或不同的地址..

相反,如果任何客户端断开连接,当然会向该套接字的 socket.io 服务器触发断开连接事件,因此考虑到这一点,您可以将 session 变量设置为 false,您可以说玩家已“断开连接”,因此当该 session 的客户端“重新连接”(即重新加载)时,socket.io 将触发“连接”事件,但读取 session 变量您可以说客户端之前已断开连接,然后再次连接。时间戳可能适用于此,因此 15 分钟后重新连接将必须加载一些额外的数据等。

所以你可以在 session 中尝试这个(假设你使用express或其他东西)

sockets.on("connection",function(socket){
 if(session.isAReload){
  // this is a reconnection
 }
 socket.set("isAReload",session.isAReload /*defaults to false*/);
});

sockets.on('close',function(){
 socket.get('isAReload',function(err,isAReload){
  if(isAReload){
   // closed after reconnecting
  }else{
   /*
    just closed connection, so next time it will be a "reload" or reconnection
    a timer of lets say 30s could run to ensure that the client is reloading
    */
   session.isAReload=true; 
  }
 });
})

关于node.js - Node : Distinguish between a reload event and a browser exit with socket event,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17627552/

相关文章:

java - S3 Java 客户端多次失败,出现 "Premature end of Content-Length delimited message body"或 "java.net.SocketException Socket closed"

c - Linux:UDP 接收消息比发送消息慢

javascript - socket.io - 升级后出错

node.js - nodejs-opencv的性能

python - Python 和 C 之间 ntohl 和 htonl 的不同行为

javascript - 使用 WebSocket 握手无法跨域传递 cookie 吗?

java - Tomcat 网络套接字 TEXT_FULL_WRITING

javascript - nodejs peepcode 教程 - 无法让它工作

node.js - 在redis中执行后续命令

java - SparkJava 异常 java.lang.NoClassDefFoundError : org/eclipse/jetty/websocket/server/pathmap/PathSpec