2016-04-07 12 views
1

Ich lerne gerade Ratchet (Bibliothek für Echtzeit-Chat-Anwendungen in PHP verwendet). Gemäß der Dokumentation wird die folgende Funktion zwei Dinge erhalten:Echtzeit-Eins-zu-eins-Nachrichten in Rachet

  1. , von dem die Nachricht kam und
  2. Nachricht.

Allerdings vermisst es wen zu senden. Diese Funktion sendet die Nachricht an alle Personen, die verbunden sind. Aber ich möchte auch einen Chat eins zu eins implementieren. Gibt es einen Weg, es zu tun?

Hier ist der Link für diese Bibliothek: http://socketo.me/docs/hello-world.

public function onMessage(ConnectionInterface $from, $msg) { 
    //send the message to all the other clients except the one who sent. 
    foreach ($this->clients as $client) { 
     if ($from !== $client) { 
      $client->send($msg); 
     } 
    } 
} 
+0

Gibt es nicht schon Platz für eine Eins-zu-eins-Meldung? habe es nie zuvor benutzt. – Chay22

+0

können Sie versuchen, https://github.com/php-pure/sacky-server – daison12006013

Antwort

1

Ich würde vorschlagen, dass Sie verschiedene Abonnements pro machen Chat der Nutzer will.

Ein Kanal für die Chat-Nachrichten zwischen allen: subscriptionname = room123

Und für jede persönliche Chat Sie eine andere Signatur verwenden: subscriptionname = personal456.

Dann lassen Sie Ihre clientside Anwendung 2 verschiedene Abonnements zuhören und versuchen, es je nachdem, was der Name des Abonnements, das die Nachricht erhalten hat, zu routen.

0

Ja, Sie können One-to-One-Nachrichten erstellen. Diese müssen jedoch weiterhin über den Socket-Server übertragen werden - direkte Peer-to-Peer-Nachrichten zwischen Browsern können nicht ausgeführt werden. Jeder Benutzer hat eine dauerhaft offene Verbindung, aber nur mit dem Server.

Sie müssen Benutzernamen für jede Clientverbindung speichern, sodass Sie beim Durchlaufen von $this->clients entweder die Verbindung oder den Benutzernamen abrufen können. Dann können Sie diese Liste an alle Abonnenten senden, abhängig davon, welche Datenschutzbeschränkungen für Ihr Design erforderlich sind.

Schließlich kann jeder Benutzer dann eine private Nachricht senden, mit der Angabe:

  • der Nachrichtentext
  • der Benutzername, dem es

adressiert Dieser von Ratchet empfangen wird, und von dort aus können Sie eine Verbindungssuche in $this->clients mit dem Benutzernamen durchführen. Die Verbindung, mit der Sie enden, ist, wenn sie noch offen ist, die Verbindung, die Sie zum Weiterleiten der Nachricht verwenden können.

Sie können optional eine "ack" (Bestätigung) an den Absender senden, um zu sagen, dass ihre Nachricht zugestellt wurde (oder nicht).