2017-02-23 108 views
1

我做了一個非常簡單的應用程序socket.io。現在,它顯示所有的連接ID:當我們打開一個新的瀏覽器選項卡時,它會添加一個ID;當我們關閉瀏覽器選項卡時,它將刪除該ID。激活閒置/非活動連接

現在,我想對於任何插座設置一個超時事件:如果一個標籤的按鈕Keep alive!還沒有被點擊3小時(這也許是因爲標籤還沒有被重新走訪3小時),我們認爲連接「半死」,並且在其他連接的頁面中使其連接ID爲grey;當我們點擊該按鈕時,該選項卡變爲活動狀態,並在其他頁面中顯示black,並重新開始倒計時3小時。

有誰知道如何實現這個?

此外,我有空閒/活動的連接,斷開以及片重訪之間的關係,兩個可選問題:

  1. 如果我們不重遊了很長一段時間開放的選項卡,將它被視爲斷開連接?

  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(號碼):沒有一個乒乓球包許多毫秒如何考慮 關閉連接(60000 ) pingInterval(數字):在發送新的ping數據包(25000)之前有多少ms 。

的socket.io客戶端將繼續發送ping或心跳,使 確保連接活着

因此,如果您的選項卡打開並且沒有任何活動,則必須在應用程序級別進行管理,而不是在socket.io級別進行管理。

要做同樣的事情,您可以使用計時器並檢查您是否從某個套接字接收到數據。定期計時器可以跟蹤活動並在您的3小時期滿後更改狀態