it-swarm.com.de

So senden Sie mit socket.io eine Nachricht an einen bestimmten Client

Ich beginne mit socket.io + node.js und weiß, wie man eine Nachricht lokal sendet und die Funktion socket.broadcast.emit() sendet: - Alle verbundenen Clients erhalten dieselbe Nachricht.

Jetzt möchte ich wissen, wie man eine private Nachricht an einen bestimmten Client sendet. Ich meine einen Socket für einen privaten Chat zwischen zwei Personen (Client-zu-Client-Stream). Vielen Dank.

80
Nizar B.

Wenn ein Benutzer eine Verbindung herstellt, sollte er eine Nachricht mit einem Benutzernamen an den Server senden, der eindeutig sein muss, z. B. eine E-Mail.

Ein Paar aus Benutzername und Socket sollte in einem Objekt wie diesem gespeichert werden:

var users = {
    '[email protected]': [socket object],
    '[email protected]': [socket object],
    '[email protected]': [socket object]
}

Senden Sie auf dem Client ein Objekt mit den folgenden Daten an den Server:

{
    to:[the other receiver's username as a string],
    from:[the person who sent the message as string],
    message:[the message to be sent as string]
}

Hören Sie auf dem Server auf Nachrichten. Wenn eine Nachricht empfangen wird, senden Sie die Daten an den Empfänger.

users[data.to].emit('receivedMessage', data)

Warten Sie auf dem Client auf die E-Mails des Servers mit dem Namen "receiveMessage" und lesen Sie die Daten, von denen er stammt, und die gesendete Nachricht.

88
Adam

Sie können socket.io Räume benutzen. Von der Clientseite aus wird ein Ereignis (in diesem Fall "beitreten", kann alles sein) mit einer eindeutigen Kennung (E-Mail, ID) ausgegeben.

Client-Seite:

var socket = io.connect('http://localhost');
socket.emit('join', {email: [email protected]});

Verwenden Sie diese Informationen nun auf der Serverseite, um einen eindeutigen Raum für diesen Benutzer zu erstellen

Serverseite:

var io = require('socket.io').listen(80);

io.sockets.on('connection', function (socket) {
  socket.on('join', function (data) {
    socket.join(data.email); // We are using room of socket io
  });
});

Jetzt hat jeder Benutzer einen Raum betreten, der nach der E-Mail des Benutzers benannt ist. Wenn Sie also einem bestimmten Benutzer eine Nachricht senden möchten, müssen Sie dies nur tun

Serverseite:

io.sockets.in('[email protected]').emit('new_msg', {msg: 'hello'});

Das letzte, was auf der Client-Seite noch zu tun ist, ist das Ereignis "new_msg" abzuhören.

Client-Seite:

socket.on("new_msg", function(data) {
    alert(data.msg);
}

Ich hoffe du kommst auf die Idee.

230
az7ar

SICHER: Einfach,

Das brauchen Sie:

io.to(socket.id).emit("event", data);

wenn ein Benutzer dem Server beitritt, werden Socket-Details einschließlich der ID generiert. Dies ist die ID, die wirklich dazu beiträgt, eine Nachricht an bestimmte Personen zu senden.

zuerst müssen wir alle socket.ids im Array speichern,

var people={};

people[name] =  socket.id;

hier ist Name der Name des Empfängers. Beispiel:

people["ccccc"]=2387423cjhgfwerwer23;

So, jetzt können wir diese socket.id mit dem Empfängernamen bekommen, wann immer wir eine Nachricht senden:

dazu müssen wir den Empfängernamen kennen. Sie müssen den Empfängernamen an den Server senden.

letzte Sache ist:

 socket.on('chat message', function(data){
io.to(people[data.receiver]).emit('chat message', data.msg);
});

Hoffe, das funktioniert gut für Sie.

Viel Glück!!

25
Trojan

Sie können sich auf socket.io rooms beziehen. Wenn Sie eine Socket-Handshake-Verbindung herstellen, können Sie ihn mit dem angegebenen Raum verbinden, z. B. "user. # {Userid}".

Danach können Sie jedem Client eine private Nachricht mit einem passenden Namen senden, zum Beispiel:

io.sockets.in ('user.125'). emit ('new_message', {text: "Hello world"})

In der obigen Operation senden wir "new_message" an Benutzer "125".

vielen Dank.

8

In einem Projekt unseres Unternehmens verwenden wir den "Raum" -Ansatz und sein Name ist eine Kombination aus Benutzer-IDs aller Benutzer in einer Konversation als eindeutige Kennung (unsere Implementierung ähnelt eher einem Facebook-Messenger). Beispiel:

| id | name | 1 | Scott | 2 | Susan

"Raum" heißt "1-2" (IDs sind absteigend geordnet) und beim Trennen von socket.io wird der Raum automatisch aufgeräumt

auf diese Weise senden Sie Nachrichten nur an diesen Raum und nur an online (verbundene) Benutzer (weniger Pakete, die über den Server gesendet werden).

2
Rami

Lassen Sie es mich mit socket.io rooms einfacher machen. Fordern Sie einen Server mit einer eindeutigen Kennung an, einem Server beizutreten. Hier verwenden wir eine E-Mail als eindeutige Kennung.

Client Socket.io

socket.on('connect', function () {
  socket.emit('join', {email: [email protected]});
});

Wenn der Benutzer einem Server beigetreten ist, erstellen Sie einen Raum für diesen Benutzer

Server Socket.io

io.on('connection', function (socket) {
   socket.on('join', function (data) {    
    socket.join(data.email);
  });
});

Jetzt sind wir alle bereit, uns anzuschließen. Lassen Sie etwas vom Server-Raum to ausgeben, damit der Benutzer mithören kann.

Server Socket.io

io.to('[email protected]').emit('message', {msg: 'hello world.'});

Lassen Sie das Thema mit dem Abhören des Ereignisses message für den Client abschließen

socket.on("message", function(data) {
  alert(data.msg);
});

Der Verweis von Socket.io Räume

0
Lalit Mohan