277

To send something to all clients, you use:

io.sockets.emit('response', data); 

To receive from clients, you use:

socket.on('cursor', function(data) { ... }); 

How can I combine the two so that when recieving a message on the server from a client, I send that message to all users except the one sending the message?

socket.on('cursor', function(data) { io.sockets.emit('response', data); }); 

Do I have to hack it around by sending the client-id with the message and then checking on the client-side or is there an easier way?

12 Answers 12

977

Here is my list (updated for 1.0):

// sending to sender-client only socket.emit('message', "this is a test"); // sending to all clients, include sender io.emit('message', "this is a test"); // sending to all clients except sender socket.broadcast.emit('message', "this is a test"); // sending to all clients in 'game' room(channel) except sender socket.broadcast.to('game').emit('message', 'nice game'); // sending to all clients in 'game' room(channel), include sender io.in('game').emit('message', 'cool game'); // sending to sender client, only if they are in 'game' room(channel) socket.to('game').emit('message', 'enjoy the game'); // sending to all clients in namespace 'myNamespace', include sender io.of('myNamespace').emit('message', 'gg'); // sending to individual socketid socket.broadcast.to(socketid).emit('message', 'for your eyes only'); // list socketid for (var socketid in io.sockets.sockets) {} OR Object.keys(io.sockets.sockets).forEach((socketid) => {}); 
Sign up to request clarification or add additional context in comments.

21 Comments

Would you like to contribute this to the FAQ? or can I do it for you? (I'd provide a backlink here)
i dont' have an io here.only socket
In complement to // sending to all clients except sender, what to use for // sending a response to sender client only ?
Could you please add that according to socket#in, socket.to('others').emit('an event', { some: 'data' }); also broadcasts in a room.
This is more useful than everything on the socket.io docs combined
|
46

From the @LearnRPG answer but with 1.0:

 // send to current request socket client socket.emit('message', "this is a test"); // sending to all clients, include sender io.sockets.emit('message', "this is a test"); //still works //or io.emit('message', 'this is a test'); // sending to all clients except sender socket.broadcast.emit('message', "this is a test"); // sending to all clients in 'game' room(channel) except sender socket.broadcast.to('game').emit('message', 'nice game'); // sending to all clients in 'game' room(channel), include sender // docs says "simply use to or in when broadcasting or emitting" io.in('game').emit('message', 'cool game'); // sending to individual socketid, socketid is like a room socket.broadcast.to(socketid).emit('message', 'for your eyes only'); 

To answer @Crashalot comment, socketid comes from:

var io = require('socket.io')(server); io.on('connection', function(socket) { console.log(socket.id); }) 

3 Comments

Awesome! How do you get socketid for sending to an individual socket?
Edited with an answer to your question. Basically it's socket.id from your socket object.
for sending to individual you can use socket.emit back who sends it or you can group the conncected clients and do @Crashalot
13

Here is a more complete answer about what has changed from 0.9.x to 1.x.

 // send to current request socket client socket.emit('message', "this is a test");// Hasn't changed // sending to all clients, include sender io.sockets.emit('message', "this is a test"); // Old way, still compatible io.emit('message', 'this is a test');// New way, works only in 1.x // sending to all clients except sender socket.broadcast.emit('message', "this is a test");// Hasn't changed // sending to all clients in 'game' room(channel) except sender socket.broadcast.to('game').emit('message', 'nice game');// Hasn't changed // sending to all clients in 'game' room(channel), include sender io.sockets.in('game').emit('message', 'cool game');// Old way, DOES NOT WORK ANYMORE io.in('game').emit('message', 'cool game');// New way io.to('game').emit('message', 'cool game');// New way, "in" or "to" are the exact same: "And then simply use to or in (they are the same) when broadcasting or emitting:" from http://socket.io/docs/rooms-and-namespaces/ // sending to individual socketid, socketid is like a room io.sockets.socket(socketid).emit('message', 'for your eyes only');// Old way, DOES NOT WORK ANYMORE socket.broadcast.to(socketid).emit('message', 'for your eyes only');// New way 

I wanted to edit the post of @soyuka but my edit was rejected by peer-review.

Comments

8

Emit cheatsheet

io.on('connect', onConnect); function onConnect(socket){ // sending to the client socket.emit('hello', 'can you hear me?', 1, 2, 'abc'); // sending to all clients except sender socket.broadcast.emit('broadcast', 'hello friends!'); // sending to all clients in 'game' room except sender socket.to('game').emit('nice game', "let's play a game"); // sending to all clients in 'game1' and/or in 'game2' room, except sender socket.to('game1').to('game2').emit('nice game', "let's play a game (too)"); // sending to all clients in 'game' room, including sender io.in('game').emit('big-announcement', 'the game will start soon'); // sending to all clients in namespace 'myNamespace', including sender io.of('myNamespace').emit('bigger-announcement', 'the tournament will start soon'); // sending to individual socketid (private message) socket.to(<socketid>).emit('hey', 'I just met you'); // sending with acknowledgement socket.emit('question', 'do you think so?', function (answer) {}); // sending without compression socket.compress(false).emit('uncompressed', "that's rough"); // sending a message that might be dropped if the client is not ready to receive messages socket.volatile.emit('maybe', 'do you really need it?'); // sending to all clients on this node (when using multiple nodes) io.local.emit('hi', 'my lovely babies'); }; 

Comments

7

broadcast.emit sends the msg to all other clients (except for the sender)

socket.on('cursor', function(data) { socket.broadcast.emit('msg', data); }); 

Comments

4

For namespaces within rooms looping the list of clients in a room (similar to Nav's answer) is one of only two approaches I've found that will work. The other is to use exclude. E.G.

socket.on('message',function(data) { io.of( 'namespace' ).in( data.roomID ).except( socket.id ).emit('message',data); } 

1 Comment

except has been removed from 1.x :/
3

Server-side all valid emit events list in V4.x

io.on("connection", (socket) => { // basic emit socket.emit(/* ... */); // to all clients in the current namespace except the sender socket.broadcast.emit(/* ... */); // to all clients in room1 except the sender socket.to("room1").emit(/* ... */); // to all clients in room1 and/or room2 except the sender socket.to(["room1", "room2"]).emit(/* ... */); // to all clients in room1 io.in("room1").emit(/* ... */); // to all clients in room1 and/or room2 except those in room3 io.to(["room1", "room2"]).except("room3").emit(/* ... */); // to all clients in namespace "myNamespace" io.of("myNamespace").emit(/* ... */); // to all clients in room1 in namespace "myNamespace" io.of("myNamespace").to("room1").emit(/* ... */); // to individual socketid (private message) io.to(socketId).emit(/* ... */); // to all clients on this node (when using multiple nodes) io.local.emit(/* ... */); // to all connected clients io.emit(/* ... */); // WARNING: `socket.to(socket.id).emit()` will NOT work, as it will send to everyone in the room // named `socket.id` but the sender. Please use the classic `socket.emit()` instead. // with acknowledgement socket.emit("question", (answer) => { // ... }); // without compression socket.compress(false).emit(/* ... */); // a message that might be dropped if the low-level transport is not writable socket.volatile.emit(/* ... */); }); 

Client-side

// basic emit socket.emit(/* ... */); // with acknowledgement socket.emit("question", (answer) => { // ... }); // without compression socket.compress(false).emit(/* ... */); // a message that might be dropped if the low-level transport is not writable socket.volatile.emit(/* ... */); 

archived link to source => http://archive.today/2021.06.22-023900/https://socket.io/docs/v4/emit-cheatsheet/index.html

Comments

1

Other cases

io.of('/chat').on('connection', function (socket) { //sending to all clients in 'room' and you io.of('/chat').in('room').emit('message', "data"); }; 

Comments

1

Updated the list for further documentation.

socket.emit('message', "this is a test"); //sending to sender-client only socket.broadcast.emit('message', "this is a test"); //sending to all clients except sender socket.broadcast.to('game').emit('message', 'nice game'); //sending to all clients in 'game' room(channel) except sender socket.to('game').emit('message', 'enjoy the game'); //sending to sender client, only if they are in 'game' room(channel) socket.broadcast.to(socketid).emit('message', 'for your eyes only'); //sending to individual socketid io.emit('message', "this is a test"); //sending to all clients, include sender io.in('game').emit('message', 'cool game'); //sending to all clients in 'game' room(channel), include sender io.of('myNamespace').emit('message', 'gg'); //sending to all clients in namespace 'myNamespace', include sender socket.emit(); //send to all connected clients socket.broadcast.emit(); //send to all connected clients except the one that sent the message socket.on(); //event listener, can be called on client to execute on server io.sockets.socket(); //for emiting to specific clients io.sockets.emit(); //send to all connected clients (same as socket.emit) io.sockets.on() ; //initial connection from a client. 

Hope this helps.

2 Comments

'io.sockets.emit' is same as 'io.emit', not 'socket.emit'
'socket.to('game').emit' equals to 'socket.broadcast.to('game').emit' so the comment above is wrong
1

Updated for Socket.io v4.0.0+

To emit to all clients except sender in v4, you use:

socket.broadcast.emit(/* ... */); 

Example Usage

io.on("connection", (socket) => { socket.on("message", (message) => { //sends "newMessage" to all sockets except sender socket.broadcast.emit("newMessage", message) }) }) 

3 Comments

how to include the sender in one call?
io.sockets.emit
sorry, i meant, if io.sockets is not available
0

use this coding

io.sockets.on('connection', function (socket) { socket.on('mousemove', function (data) { socket.broadcast.emit('moving', data); }); 

this socket.broadcast.emit() will emit everthing in the function except to the server which is emitting

3 Comments

how do you get io inside this if the callback is defined in anther file
I have my app in multiple files, and I concat them with PrePros or Koala instead of requiring them, it allows me to share all of their variables
Or having io as global
0

I am using namespaces and rooms - I found

socket.broadcast.to('room1').emit('event', 'hi'); 

to work where

namespace.broadcast.to('room1').emit('event', 'hi'); 

did not

(should anyone else face that problem)

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.