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.
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...
Discussion
View additional discussion.