2013-08-16 4 views
1

Je souhaite déconnecter les utilisateurs de socket.io après 2 heures d'inactivité et leur donner un bouton invite/reconnecter.Socket.io déconnexion automatique après 2 heures d'inactivité ne fonctionne pas

Tout d'abord, j'ai mis reconnexion automatique à false et une forcedc variable:

var socket = io.connect('https://coinchat.org:443',{secure: true, reconnect: false}); 
var forcedc = false; 

Ensuite, j'ai un temps pour inactivité qui est remis à zéro quand on déplace la souris:

$("body").mousemove(function(e){ 
    clearTimeout(dcTimeout); 
    dcTimeout = setTimeout(function(){ 
     if(!forcedc){ 
      forcedc = true; 
      socket.disconnect(); 
      $("#dcmodal").modal('show'); 
     } 
    }, 1000 * 60 * 60 * 2); 
}); 

Fondamentalement, forcedc signifie que l'utilisateur a été déconnecté en raison de l'inactivité et que le navigateur ne doit pas actualiser la page pour essayer de se reconnecter. Si forcedc est false, cela signifie que l'utilisateur a été déconnecté en raison de problèmes réseau/redémarrages du serveur et que le navigateur doit actualiser la page pour se reconnecter.

Maintenant, quand la prise est déconnecté:

socket.on("disconnect", function(data){ 
    if(!forcedc){ 
     setTimeout(function(){document.location.reload(true)}, 1000 + Math.random()*12750); 
    } 
}); 

La page doit rafraîchir si forcedc est faux. Cependant, la page se rafraîchit même si l'utilisateur a déjà été "déconnecté" en raison d'une inactivité (je sais que forcedc = true a été exécuté, car je vois le modal déconnecté).

Qu'est-ce que je fais mal?

+1

Bonjour, j'ai écrit une petite application avec votre code et cela fonctionne comme. Si vous ne pouvez pas en partager un peu plus (ou si vous voulez partager mon propre extrait), je ne pense pas un chiffre là où le bug est. – danielepolencic

+0

Que faire si vous changez * if (! Forcedc) {* en if (forcedc === false) {* – Krasimir

+0

Cela fonctionne comme prévu pour moi. Est-ce le code exact que vous testez? – user568109

Répondre

0

Je suppose que cela doit être avec les fermetures ... Où déclarez-vous forcedc? et où sont ces 2 morceaux de code dans tout votre code?

Apparemment les variables forcedc ne met pas à jour comme ils le devraient, ce qui pourrait signifier un d'eux est une copie locale

+0

forcedc est déclaré globalement. – apscience

+0

Lorsque vous ajoutez un point d'arrêt dans l'écouteur d'événement de déconnexion et que vous recherchez chaque instance de la variable forcedc, la valeur est-elle toujours la même? –

0

Sans plus de détails, il est difficile de répondre. Existe-t-il un autre endroit où vous utilisez forcedc sur le code? Une chose que vous pouvez essayer est de le mettre dans un objet: namespace.forcedc = true pour forcer l'héritage de fermeture

1

Je crois que dcTimeout ne s'efface jamais via 'clearTimeout (dcTimeout); "Par conséquent, dcTimeout est exécuté et forcedc devient . vrai

solution possible:. déclarer dcTimeout comme une variable globale ainsi forcedc est ici un jsfiddle link avec mon code de test pour votre référence

function communication() { 

    var socket = io.connect('http://localhost:8080',{reconnect: false}); 
    socket.on('connect', function() { 

     var forcedc = false; 
     var dcTimeout = null; 

     console.log("connected to the server!"); 

     socket.on('news', function (data) { 

     console.log(data); 
     }); 

     socket.on("disconnect", function(data){ 

      console.log("disconnected..") 
      if(!forcedc){ 
       console.log("forcedc is false and the socket has been disconnected"); 
       setTimeout(function(){ 
        console.log("Reloading the document in 2 seconds"); 
        //document.location.reload(true) 
       }, 2000); 
      } 
     }); 

     document.onmousemove = function(e){ 

      console.log("mouse movement detected"); 
      clearTimeout(dcTimeout); 
      dcTimeout = setTimeout(function(){ 
       if(!forcedc){ 
        forcedc = true; 
        console.log("disconnecting...setting to true"); 
        socket.disconnect(); 
        //$("#dcmodal").modal('show'); 
        console.log("Disconnected! Do you want to reconnect?"); 
       } 
      }, 5000 * 1); 
     } 
    }); 
} 
Questions connexes