Broadcasting means sending a message to all connected clients. Broadcasting can be done at multiple levels. We can send the message to all the connected clients, to clients on a namespace and clients in a particular room.
To send a message to the particular client, we are must provide socket.id of that client to the server and at the server side socket.io takes care of delivering that message by using, socket.broadcast.to('ID'). emit( 'send msg', {somedata : somedata_server} ); For example,user3 want to send a message to user1.
Both server and client node processes use 95-100% of a CPU core each. So pure throughput looks ok. I can emit 100 messages per second to 100 local clients at 55% CPU usage on the server process.
Seems I was able to solve this for myself after opening a bounty. Sorry about that.
Anyway, see if this helps:
chat.on('connection', function (socket) {
socket.on('message', function (msg) {
socket.emit(msg); // Send message to sender
socket.broadcast.emit(msg); // Send message to everyone BUT sender
});
});
However, you could save some bandwidth and create a more snappy experience for users if you don't resend it to the sender. Just add their messages directly to the chat log, and optionally use use only self-emit to confirm it was received without issue.
You solution works if you are working in an evented environment where messages from the client trigger a response to all others, but not if you want the server to sent messages to all clients.
You can do this using io.sockets.emit
:
var io = require('socket.io').listen(80);
io.sockets.emit('message', { message: "Hello everyone!" });
However the documentation isn't clear for how to do this to a specific namespace. io.sockets
is just a shortcut to io.of('')
, as such you can broadcast to everyone on a namespace by calling io.of('/namespace').emit
:
var io = require('socket.io').listen(80);
io.of('/admins').emit('message', { message: "Hello admins!" });
var customNS = ioserver.of('/chat');
customNS.on('connection', function (socket) {
socket.on('message', function (msg) {
// Send message to sender
socket.emit(msg);
// Send message to everyone on customNS INCLUDING sender
customNS.emit(msg);
// Send message to everyone on customNS BUT sender
socket.broadcast.emit(msg);
// Send message to everyone on ROOM chanel of customNS INCLUDING sender
customNS.in('ROOM').emit(msg);
// Send message to everyone on ROOM chanel of customNS BUT sender
socket.broadcast.in('ROOM').emit(msg);
});
});
also check this answer Send response to all clients except sender (Socket.io)
Maybe this will help someone
socket.broadcast.to('room1').emit('updatechat', 'SERVER', username + ' has connected to this room');
see
Nodejs and Socketio Multiroom Chat Tutorial
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