我在我的rails应用程序上使用socket.io来在数据库上在线/离线服务器用户,我使用Redis存储数据,0表示脱机,1表示在线状态 在我的app.js文件上
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); }); }); });
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布局上,我在application.js文件中包含了socket.io.js并且运行良好
除非用户同时打开两个窗口,如果他关闭一个窗口断开连接事件并且其状态变为离线,那么每件事情都能正常工作,如何在用户关闭所有窗口时才能使断开连接事件正常工作一个?
答案 0 :(得分: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);
});
});