0

Railsアプリでsocket.ioを使用して、データベースのユーザーをオンライン/オフラインでサーバーします。データの保存にRedisを使用し、app.jsファイルにオフラインで0、オンラインステータスで1を使用しています。

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);

     });

ユーザーが2つのウィンドウを同時に開いた場合を除いて、すべてが正常に機能しています。1つのウィンドウを閉じると、切断イベントがトリガーされ、ステータスがオフラインになります。ユーザーが1つだけでなくすべてのウィンドウを閉じた場合にのみ、切断イベントを機能させるにはどうすればよいですか。

4

1 に答える 1

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);
  });
});
于 2013-03-02T01:40:52.103 に答える