2017-02-23 1 views
1

J'ai fait une application très simple avec socket.io. Maintenant, il affiche tous les identifiants de connexion: lorsque nous ouvrons un nouvel onglet du navigateur, il ajoute un identifiant; lorsque nous fermons un onglet du navigateur, il supprime l'identifiant. Maintenant, je veux définir un événement timeout pour n'importe quel socket: Si le bouton Keep alive! d'un onglet n'a pas été cliqué pendant 3 heures (c'est peut-être parce que l'onglet n'a pas été revisité depuis 3 heures), nous considérons la connexion "semi-mort", et faire sa connexion ID grey dans la page d'autres connexions; lorsque nous cliquons sur le bouton, l'onglet devient vivant et black dans les autres pages, et redémarre le compte à rebours de 3 heures.Activer les connexions inactif/inactif

Est-ce que quelqu'un sait comment implémenter cela?

De plus, j'ai deux questions facultatives sur les relations entre inactivité/connexions inactives, débrancher et tabulations revisiter:

  1. Si nous ne revoie un onglet ouvert depuis longtemps, sera-t être considéré comme une déconnexion?

  2. Est-il possible de définir un événement de re-visite sur un onglet du navigateur?

Mon arrière-plan en cours:

var express = require('express'); 
var app = express(); 
var server = require('http').createServer(app); 
var io = require('socket.io').listen(server); 
var ids = []; 

server.listen(3000); 

app.get('/', function (req, res) { 
    res.sendfile(__dirname + '/index.html'); 
}); 

io.sockets.on('connection', function(socket) { 
    ids.push(socket.id); 
    io.sockets.emit('ids', ids); 

    socket.on('disconnect', function() { 
     var index = ids.indexOf(socket.id); 
     ids.splice(index, 1); 
     io.sockets.emit('ids', ids);  
    }) 
}); 

-end avant:

<button type="button" onclick="alert('Keep alive!')">Keep alive!</button> 
<div id="ids"></div> 
<script src="http://code.jquery.com/jquery-latest.min.js"></script> 
<script src="/socket.io/socket.io.js"></script> 
<script> 
    jQuery(function($) { 
     var socket = io.connect(); 
     var $ids = $('#ids'); 

     socket.on('ids', function (data) { 
      var html =""; 
      for (i = 0; i < data.length; i++) { 
       html += data[i] + "<br/>"; 
      }; 
      $ids.html(html); 
     }) 
    }); 
</script> 

Répondre

1

Socket.io gère délai d'attente à l'aide du rythme cardiaque (versions 0.9.x) ou en utilisant ping (version 1 .x et suivantes). Une fois que vous avez défini ces délais sur le serveur et que le client est compatible avec socket.io, le socket ne se déconnecte jamais automatiquement. Bien sûr, il se déconnectera s'il perd le réseau ou un délai d'attente réseau ou si quelqu'un le déconnecte.

Voir le texte ci-dessous de la spécification socketio actuelle:

Parmi ces options:

pingTimeout (Number): combien de ms sans un paquet pong à considérer la connexion fermée (60000 pingInterval (Nombre): combien de ms avant d'envoyer un nouveau paquet ping (25000).

Le client socket.io gardera l'envoi d'un ping ou un battement de coeur pour faire que la connexion est en vie

. Par conséquent, si votre onglet est ouvert et s'il n'y a aucune activité, vous devrez le gérer au niveau de votre application et non au niveau socket.io. Pour faire de même, vous pouvez utiliser une minuterie et vérifier quand vous avez reçu les données d'une certaine prise. La minuterie périodique peut garder une trace de l'activité et changer l'état une fois que votre période de 3 heures expire