Get Even More Visitors To Your Blog, Upgrade To A Business Listing >>

Socket.io disconnect event triggering on new connection

Socket.io disconnect event triggering on new connection

Problem

I am trying to build a chat server and client using node and socket.io following a tutorial from a book.The front-end code is as follows:



    Socket.IO example application
    Your message:
    

And back-end is:

/*jslint node: true */
var httpd = require('http').createServer(handler);
var io = require('socket.io').listen(httpd);
var fs = require('fs');

function handler(req, res) {
    "use strict";
    fs.readFile(__dirname + '/index.html', function (err, data) {
        if (err) {
            res.writeHead(500);
            return res.end('Error Loading index.html');
        }

        res.writeHead(200);
        res.end(data);
    });
}

httpd.listen(4001);

io.sockets.on('connection', function (socket) {
    "use strict";
    socket.on('login', function(username) {
        socket.set('username', username, function (err) {
            if (err) {
                throw err;
            }
            socket.emit('serverMessage', 'Currently logged in as ' + username);
            socket.broadcast.emit('serverMessage', 'User ' + username + ' logged in');
        });
    });

    socket.on('clientMessage', function (content) {
        socket.emit('serverMessage', 'You said: ' + content);
        socket.get('username', function (err, username) {
            if (!username) {
                username = socket.id;
            }
            socket.get('room', function (err, room) {
                if (err) {
                    throw err;
                }
                var broadcast = socket.broadcast,
                    message = content;
                if (room) {
                    broadcast.to(room);
                }
                broadcast.emit('serverMessage', username + ' said: ' + message);
            });
        });
    });

    socket.on('join', function (room) {
        socket.get('room', function (err, oldRoom) {
            if (err) {
                throw err;
            }
            socket.set('room', room, function (err) {
                if (err) {
                    throw err;
                }
                socket.join(room);
                if (oldRoom) {
                    socket.leave(oldRoom);
                }
                socket.get('username', function (err, username) {
                    if (!username) {
                        username = socket.id;
                    }
                    socket.emit('serverMessage', 'You joined room' + room);
                });
                socket.get('username', function (err, username) {
                    if (!username) {
                        username = socket.id;
                    }
                    socket.broadcast.to(room).emit('serverMessage', 'User ' + username + ' joined this room');
                });
            });
        });
    });

    socket.on('disconnect', function() {
        socket.get('username', function (err, username) {
            if (!username) {
                username = socket.id;
            }
            socket.broadcast.emit('serverMessage', 'User ' + username + ' disconnected');
        });
    });

    socket.emit('login');
});

The problem I am facing is that whenever a new user logs in, all the previous users get a message saying "User " + randomID + "disconnected" before the new user logs in and it functions normally. This problem does not occur if a new user logs in quickly after the immediately previous user logged in (I'm guessing it has something to do with heartbeat here). I'd really appreciate any help in figuring out why this disconnect event is being triggered every time a new user logs in. Thanks.

Problem courtesy of: Moriarty

Solution

alert or prompt in javascript are blocking functions, they stop all javascript events on browsers.

That is why the 'heart' inside socket.io stops beating.

In more detail:

In every heartbeat, the server sends a packet to the clients for checking if the clients are alive or dead, and if a client is not responsive, the server thinks it is dead.

The solution is replacing prompt function with async function, a popup div, form, etc...

Solution courtesy of: damphat

Discussion

View additional discussion.



This post first appeared on Node.js Recipes, please read the originial post: here

Share the post

Socket.io disconnect event triggering on new connection

×

Subscribe to Node.js Recipes

Get updates delivered right to your inbox!

Thank you for your subscription

×