розетка.io: событие disconnect не запускается

Я сделал простой счетчик посещений в реальном времени.

Вы можете скачать его с этот репозиторий.

происходит то, что событие disconnect (даже после закрытия браузера) на сервере никогда не запускается.

сервер.js is:

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

3 ответов


поместите код отключения в блок on connect и отредактируйте его немного следующим образом:

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

таким образом, вы обнаруживаете, когда конкретный сокет (в частности, сокет, который вы передаете своей анонимной функции, которая запускается при подключении) отключен.


От Гнезда.IO 1.0 на io.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
        });
    });
});

Примечание:.once вместо .on и слушатель будет автоматически удален из socket что хорошо для нас сейчас, потому что событие disconnect запускается только один раз на сокет.


на всякий случай, если кто-то еще сделал эту глупую ошибку: убедитесь, что любое промежуточное ПО сокета вы определили вызовы 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");
    });
});