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 ); });
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.
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With