2017-02-23 12 views
1

私はsocket.ioで非常に簡単なアプリを作った。これで、すべての接続IDが表示されます。新しいブラウザタブを開くと、IDが追加されます。ブラウザのタブを閉じるとidを削除します。アイドル/非アクティブ接続を有効にする

ここで、任意のソケットに対して1つのタイムアウトイベントを設定します。タブのKeep alive!ボタンが3時間クリックされていない場合(タブが3時間再訪問されなかったため)接続が "セミデッド"で、他の接続のページにその接続IDをgreyにします。ボタンをクリックすると、タブが生き残り、他のページにはblackが表示され、3時間のカウントダウンが再開されます。

これを実装する方法を知っている人はいますか?それは意志、私たちはしていない場合は

  1. が長時間開いタブを再訪問:

    また、私はアイドル/非アクティブな接続、切断およびタブ再訪間の関係についての2つのオプションの質問があります切断とみなされますか?

  2. ブラウザタブで再訪イベントを設定することはできますか?

私の現在のバックエンド:

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

フロントエンド:

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

答えて

1

Socket.ioハートビート(0.9.xバージョン)を使用して、またはpingを(バージョン1を使用してタイムアウトを管理します.x以降)。これらのタイムアウトをサーバーに設定すると、クライアントがsocket.ioに準拠している場合、ソケットは自動的に切断されません。もちろん、ネットワークやネットワークタイムアウトを失ったり、誰かが切断したりすると切断されます。

現在socketio仕様から下のテキストを参照してください。これらのオプションの中で

pingTimeout(番号):どのように多くのMSピンポンパケットなし 接続がクローズ(60000を検討します) pingInterval(Number):新しいピングパケット(25000)を送信する前に、何キロ数msの 。

socket.ioクライアントは接続が

生きている ことを確認するには、pingやハートビートの送信を続けます。

したがって、タブが開いていてもアクティビティがない場合は、socket.ioレベルではなくアプリケーションレベルでこれを管理する必要があります。

これを行うには、タイマーを使用して特定のソケットからデータを受信したときにチェックすることができます。定期的なタイマーは、3時間の期間が経過するとアクティビティを追跡し、ステータスを変更することができます

関連する問題