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);
});
});
你能提供给我的一些代码? – 2013-03-02 01:49:09
已添加,但它是近似的,未经测试!希望它给你的想法。 – 2013-03-02 02:28:12
如何将用户标识传递给断开连接? – chovy 2013-12-09 06:42:38