I can only seem emit messages to users when their socket id has been directly stored within the io.sockets.on(‘connect’) function. I don’t know why it doesn’t work when trying to store their socket id after they have logged in.
Working:
var clients = {};
/** A new socket connection has been accepted */
io.sockets.on('connection', function (socket)
{
//Used to access session id
var hs = socket.handshake;
clients[socket.id] = socket; // add the client data to the hash
users['brownj2'] = socket.id; // connected user with its socket.id
socket.on('user-login', function(user){
if(!users[username]){
//users[username] = socket.id; // connected user with its socket.id
}
})
socket.on('page-load', function(pid)
{
if(users['brownj2'])
{
clients[users['brownj2']].emit('hello');
}
else
{
console.log("NOT FOUND BROWNJ2");
}
}
}
Not working:
var clients = {};
/** A new socket connection has been accepted */
io.sockets.on('connection', function (socket)
{
//Used to access session id
var hs = socket.handshake;
clients[socket.id] = socket; // add the client data to the hash
socket.on('user-login', function(user){
if(!users['brownj2']){
users['brownj2'] = socket.id; // connected user with its socket.id
}
})
socket.on('page-load', function(pid)
{
if(users['brownj2'])
{
clients[users['brownj2']].emit('hello');
}
else
{
console.log("NOT FOUND BROWNJ2");
}
}
}
JavaScript Client-side code snippet
var socket = io.connect('');
socket.on("hello", function(){
alert("Hi Jack");
console.log("WEBSOCKET RECIEVED");
})
Solution: Thanks @alessioalex
I have had to remove the reference to socket.io from the login page, and add the following into io.sockets.on(‘connection’)
var hs = socket.handshake;
sessionStore.get(hs.sessionID, function(err, session){
console.log("SESSION: " + util.inspect(session));
clients[socket.id] = socket; // add the client data to the hash
validUsers[session.username] = socket.id; // connected user with its socket.id
})
There are some problems with your code, the first being you shouldn’t authenticate users through Socket.IO, you should make sure they can connect only after they authenticated. If you are using Express, then the following article can help you a lot: http://www.danielbaulig.de/socket-ioexpress/
Also you should be avoiding sending messages like so, since that is part of Socket.IO internally and may change:
Instead (if you want to send a message to a specific client) it’s better to keep an object for example with the connected clients (and remove the client once disconnected):
Sure,
io.sockets.socket(id)may work (didn’t actually test), but also it can be always changed as it’s part of the Socket.IO internals, so my solution above is more ‘safe’.Another thing you may want to change in your code on the client side is
var socket = io.connect('');withvar socket = io.connect('http://localhost');, as we can see in the official example of Socket.IO here: http://socket.io/#how-to-use