Antwort an alle Kunden außer Absender senden


225

Um etwas an alle Kunden zu senden, verwenden Sie:

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

Um von Kunden zu empfangen, verwenden Sie:

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

Wie kann ich beide kombinieren, damit ich beim Empfang einer Nachricht auf dem Server von einem Client diese Nachricht an alle Benutzer außer dem Benutzer sende, der die Nachricht sendet?

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

Muss ich es hacken, indem ich die Client-ID mit der Nachricht sende und dann auf der Client-Seite überprüfe, oder gibt es einen einfacheren Weg?

Antworten:


840

Hier ist meine Liste (aktualisiert für 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) => {});

14
Möchten Sie dies zu den FAQ beitragen ? oder kann ich es für dich tun (Ich würde hier einen Backlink bereitstellen)
Kos

1
Ich habe kein ioHere.onlysocket
Chovy

2
Als Ergänzung zu // sending to all clients except sender, wofür zu verwenden // sending a response to sender client only ?
Basj

4
Könnten Sie bitte hinzufügen , dass nach Buchse # , socket.to('others').emit('an event', { some: 'data' });auch Sendungen in einem Raum.
Gongzhitaao

119
Dies ist nützlicher als alles in den Dokumenten von socket.io zusammen
Jonathan.

43

Aus der @ LearningRPG-Antwort, jedoch mit 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');

Um @Crashalot Kommentar zu beantworten, socketidkommt von:

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

3
Genial! Wie kommen Sie socketidzum Senden an eine einzelne Steckdose?
Crashalot

2
Mit einer Antwort auf Ihre Frage bearbeitet. Im Grunde ist es socket.idvon Ihrem Socket-Objekt.
Sojuka

Zum Senden an eine Person können Sie socket.emit zurück verwenden, wer es sendet, oder Sie können die verbundenen Clients gruppieren und @Crashalot
ujwal dhakal

12

Hier ist eine vollständigere Antwort darauf, was sich von 0.9.x auf 1.x geändert hat.

 // 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

Ich wollte den Beitrag von @soyuka bearbeiten, aber meine Bearbeitung wurde durch Peer-Review abgelehnt.


6

Broadcast.emit sendet die Nachricht an alle anderen Clients (außer an den Absender).

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

6

Cheatsheet ausgeben

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');

};

4

Für Namespaces in Räumen ist das Schleifen der Liste der Clients in einem Raum (ähnlich der Antwort von Nav) einer von nur zwei Ansätzen, die ich gefunden habe und die funktionieren werden. Die andere ist ausschließen zu verwenden. Z.B

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

7
außer wurde aus 1.x entfernt: /
coulix

1

Andere Fälle

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

1

Die Liste für weitere Dokumentation wurde aktualisiert.

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.

Hoffe das hilft.


'io.sockets.emit' ist dasselbe wie 'io.emit', nicht 'socket.emit'
Doctor.Who.

'socket.to (' game '). emit' entspricht 'socket.broadcast.to (' game '). emit', daher ist der obige Kommentar falsch
Doctor.Who.

0

Verwenden Sie diese Codierung

io.sockets.on('connection', function (socket) {

    socket.on('mousemove', function (data) {

        socket.broadcast.emit('moving', data);
    });

Dieses socket.broadcast.emit () gibt alles in der Funktion aus, außer an den Server, der sendet


1
Wie kommst du iohinein, wenn der Rückruf in einer anderen Datei definiert ist
chovy

Ich habe meine App in mehreren Dateien und ich konzentriere sie mit PrePros oder Koala, anstatt sie zu benötigen. Dadurch kann ich alle ihre Variablen teilen
Steel Brain

1
Oder ioals global
Vadorequest

0

Ich benutze Namespaces und Räume - ich habe gefunden

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

wo arbeiten

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

nicht

(Sollte jemand anderes mit diesem Problem konfrontiert sein)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.