socket.io断开连接和浏览器关闭

问题描述:

我在我的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); 

    }); 

除非用户在同一时间打开两个窗口,如果他关闭一个触发的窗口断开连接事件并且他的状态变为脱机,那么每个事情都可以正常工作,但是如何才能使断开连接事件仅在用户关闭所有窗口时才起作用?

而不是二进制来存储状态,也许使用连接计数器。连接时递增和断开时递减。当它为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