2017-02-23 3 views
1

Ich habe eine sehr einfache App mit socket.io gemacht. Nun werden alle Verbindungs-IDs angezeigt: Wenn wir eine neue Browser-Registerkarte öffnen, wird eine ID hinzugefügt. Wenn wir eine Browser-Registerkarte schließen, wird die ID entfernt.Aktiviere inaktive Verbindungen

Jetzt möchte ich ein Timeout-Ereignis für einen Socket festlegen: Wenn die Schaltfläche Keep alive! eines Tabs seit 3 ​​Stunden nicht angeklickt wurde (vielleicht weil der Tab für 3 Stunden nicht erneut besucht wurde), berücksichtigen wir die Verbindung "semi-dead", und seine Verbindung ID grey in der Seite von anderen Verbindungen; Wenn wir auf die Schaltfläche klicken, wird die Registerkarte aktiv und black in anderen Seiten und startet den Countdown von 3 Stunden neu.

Weiß jemand, wie man das umsetzt?

Außerdem habe ich zwei optionalen Fragen über die Beziehungen zwischen Leerlauf-/inaktive Verbindungen trennen und Tabula Neubetrachtung:

  1. Wenn wir nicht eine offene Lasche für lange Zeit wieder besuchen, wird es als eine Trennung betrachtet werden?

  2. Ist es möglich, ein erneutes Besuchsereignis auf einer Browserregisterkarte festzulegen?

Mein aktuelles Back-End:

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);  
    }) 
}); 

Front-End:

<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> 

Antwort

1

Socket.io verwaltet Timeout mit Herzschlag (0.9.x-Versionen) oder mit ping (Version 1 .x ab). Sobald Sie diese Timeouts auf dem Server festgelegt haben und der Client socket.io-kompatibel ist, wird der Socket niemals automatisch getrennt. Natürlich wird es getrennt, wenn es Netzwerk oder ein Netzwerk-Timeout verliert oder jemand trennt sie.

Siehe unten stehenden Text aus der aktuellen socketio spec:

Zu diesen Optionen:

pingTimeout (Number): wie viele ms ohne Pong-Signal die Verbindung (60000 geschlossen zu betrachten) pingInterval (Anzahl): wie viele ms vor dem Senden eines neuen Ping-Pakets (25000).

Der socket.io Client hält einen Ping oder ein Herzschlag Senden sicher, dass die Verbindung aktiv ist

zu machen.

Wenn also Ihre Registerkarte geöffnet ist und keine Aktivität vorliegt, müssen Sie dies auf Ihrer Anwendungsebene und nicht auf der Ebene socket.io verwalten.

Um das gleiche zu tun, können Sie einen Timer verwenden und überprüfen, wenn Sie die Daten von einem bestimmten Socket erhalten. Der periodische Timer kann die Aktivität verfolgen und den Status ändern, sobald der 3-Stunden-Zeitraum abgelaufen ist

Verwandte Themen