Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

socket.io: disconnect event isn't fired

I have made a simple realtime visitor counter.

You can download it from this repository.

What happens is that disconnect event (even after browser closing) on server is never fired.

server.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 on the client is:

    script(type='text/javascript')          var socket = io.connect();          socket.on('count', function (data) {             $('#count').html( data.number );         }); 
like image 832
Giovanni Bitliner Avatar asked Apr 26 '12 22:04

Giovanni Bitliner


People also ask

How do you emit an event in socket IO?

sockets. emit('event', data); Socket.io can also broadcast messages to group of sockets, this feature is called rooms. If you want to send a message to only one socket, you can mark the sockets with an extra property when they connect and then search those sockets in the list of connected sockets.

How do I disconnect a room in socket IO?

From the client, you send your own message to the server and ask the server to remove it from the room. The server can then use socket. leave("someRoom") to remove that socket from a given room.


1 Answers

Put your on disconnect code inside your on connect block and edit it a bit like so:

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

This way you're detecting when a specific socket (specifically the socket you pass to your anonymous function that is run on connection) is disconnected.

like image 93
swiecki Avatar answered Oct 16 '22 16:10

swiecki