2012-04-26 20 views
26

私は簡単なリアルタイムビジターカウンタを作った。socket.io:切断イベントが発生しない

this repositoryからダウンロードできます。

何が起きるかは、サーバー上の切断イベント(ブラウザーを閉じた後でも)が一度も実行されないことです。

server.jsは次のとおりです。クライアント上

(function() { 
var app, count, express, io; 

express = require('express'); 
io = require('socket.io'); 

app = module.exports = express.createServer(); 

app.configure(function() { 
    app.set('views', __dirname + '/views'); 
    app.set('view engine', 'jade'); 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 
    app.use(require('stylus').middleware({ 
     src: __dirname + '/public' 
    })); 
    app.use(app.router); 
    return app.use(express.static(__dirname + '/public')); 
}); 

app.configure('development', function() { 
    return app.use(express.errorHandler({ 
     dumpExceptions: true, 
     showStack: true 
    })); 
}); 
app.configure('production', function() { 
    return app.use(express.errorHandler()); 
}); 

io = require('socket.io').listen(app); 

count = 0; 

io.sockets.on('connection', function (socket) { 
    count++; 
    io.sockets.emit('count', { 
     number: count 
    }); 
}); 

io.sockets.on('disconnect', function() { 
    console.log('DISCONNESSO!!! '); 
    count--; 
    io.sockets.emit('count', { 
     number: count 
    }); 
}); 


app.get('/', function (req, res) { 
    return res.render('index', { 
     title: 'node.js express socket.io counter' 
    }); 
}); 
if (!module.parent) { 
    app.listen(10927); 
    console.log("Express server listening on port %d", app.address().port); 
} 

}).call(this); 

スクリプトです:

script(type='text/javascript') 

     var socket = io.connect(); 

     socket.on('count', function (data) { 
      $('#count').html(data.number); 
     }); 

答えて

44

接続ブロックの上にあなたの内側にあなたの接続解除のコードを入れて、少しので、同じように編集:

io.sockets.on('connection', function (socket) { 
    count++; 
    io.sockets.emit('count', { 
     number: count 
    }); 

    socket.on('disconnect', function() { 
     console.log('DISCONNESSO!!! '); 
     count--; 
     io.sockets.emit('count', { 
      number: count 
     }); 
    }); 
}); 

このようにして、特定のソケット(具体的には、実行している匿名関数に渡すソケットオン接続)が切断されます。

+0

上記のsocket.onは書かれていますか? – swiecki

+0

パーフェクト、今は正常に動作します –

+5

FYI、xhr-pollingがトランスポートに使用されている場合、切断前にかなりの遅延が発生する可能性があります。 –

2

からSocket.IO 1.0io.engine.clientsCountプロパティが利用可能です。このプロパティは、あなたのアプリが現在開いている接続の数を示します。

io.sockets.on('connection', function (socket) { 
    io.sockets.emit('count', { 
     number: io.engine.clientsCount 
    }); 

    socket.once('disconnect', function() { 
     io.sockets.emit('count', { 
      number: io.engine.clientsCount 
     }); 
    }); 
}); 

注:代わりに.onの使用.onceとリスナーが切断イベントだけソケットごとに一度解雇されているので、今、私たちのために良いものsocketから自動的に削除されます。

0

誰かがこのばかげた間違いをした場合:あなたが定義したソケットミドルウェアが末尾にnext()を呼び出すことを確認してください。他のソケットハンドラは実行されません。

// make sure to call next() at the end or... 
io.use(function (socket, next) { 
    console.log(socket.id, "connection middleware"); 
    next(); // don't forget this! 
}); 

// ...none of the following will run: 

io.use(function (socket, next) { 
    console.log(socket.id, "second middleware"); 
    next(); // don't forget this either! 
}); 

io.on("connection", function (socket) { 
    console.log(socket.id, "connection event"); 
    socket.once("disconnect", function() { 
     console.log(socket.id, "disconnected"); 
    }); 
});