2013-03-02 63 views
0

我在我的rails應用程序上使用socket.io向服務器用戶在線/脫機對數據庫,我使用Redis存儲數據和0離線,1在線狀態 在我的應用程序js文件 socket.io斷開連接和瀏覽器關閉

var app = require('express')() 
, redis = require('redis') 
, client = redis.createClient() 
, server = require('http').createServer(app) 
, io = require('socket.io').listen(server); 

server.listen(80); 

io.sockets.on('connection', function (socket) { 
console.log("client connected") 


socket.on('join',function(userid){ 
socket.set('userid',userid); 

var utm ="user:"+userid+":online_status"; 
client.set(utm,1); 

}); 
socket.on('disconnect',function(userid){ 
socket.get('userid',function(err,userid){ 
var utm ="user:"+userid+":online_status"; 
client.set(utm,0); 
}); 
}); 
}); 

和我application.html佈局我包括已socket.io.js我的application.js文件和它運作良好



    var socket = io.connect('http://localhost:80'); 

    socket.on('connect',function(data){ 
     var userID = current_user.id; 
     socket.emit('join',userID); 

    }); 

除非用戶在同一時間打開兩個窗口,如果他關閉一個觸發的窗口斷開連接事件並且他的狀態變爲脫機,那麼每個事情都可以正常工作,但是如何才能使斷開連接事件僅在用戶關閉所有窗口時才起作用?

回答

1

而不是二進制來存儲狀態,也許使用連接計數器。連接時遞增和斷開時遞減。當它爲0時,用戶已關閉所有窗口。

如果用戶以阻止斷開事件觸發的方式消失(例如,瀏覽器崩潰,網絡斷開連接等),您也可以考慮在這些計數器上到期。

此代碼是近似的,但嘗試:

socket.on('join',function(userid){ 
    socket.set('userid',userid); 
    var utm ="user:"+userid+":online_status"; 
    client.incr(utm); 
}); 

socket.on('disconnect',function(userid){ 
    socket.get('userid',function(err,userid){ 
    var utm ="user:"+userid+":online_status"; 
    client.decr(utm); 
    }); 
}); 
+0

你能提供給我的一些代碼? – 2013-03-02 01:49:09

+0

已添加,但它是近似的,未經測試!希望它給你的想法。 – 2013-03-02 02:28:12

+0

如何將用戶標識傳遞給斷開連接? – chovy 2013-12-09 06:42:38