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

时间:2013-03-02 01:33:52

标签: ruby-on-rails node.js socket.io

我在我的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并且运行良好

除非用户同时打开两个窗口,如果他关闭一个窗口断开连接事件并且其状态变为离线,那么每件事情都能正常工作,如何在用户关闭所有窗口时才能使断开连接事件正常工作一个?

1 个答案:

答案 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);
  });
});