send
Beschreibung:
mixed Connection::send(mixed $data [,$raw = false])
Sendet Daten an den Client
Parameter
$data
Die Daten, die gesendet werden sollen. Wenn beim Initialisieren der Worker-Klasse ein Protokoll angegeben wurde, wird automatisch die encode-Methode des Protokolls aufgerufen, um die Protokollverpackung durchzuführen und sie an den Client zu senden.
$raw
Ob die rohen Daten gesendet werden sollen, d.h. ob die encode-Methode des Protokolls nicht aufgerufen werden soll. Der Standardwert ist false, was bedeutet, dass die encode-Methode des Protokolls automatisch aufgerufen wird.
Rückgabewert
true bedeutet, dass die Daten erfolgreich in den Socket-Sende-Puffer auf der Betriebssystemebene dieser Verbindung geschrieben wurden.
null bedeutet, dass die Daten in den Anwendungs-Puffer der Verbindung geschrieben wurden und auf das Schreiben in den Socket-Sende-Puffer der Betriebssystemebene warten.
false bedeutet, dass das Senden fehlgeschlagen ist. Der Grund für das Scheitern kann sein, dass die Client-Verbindung bereits geschlossen wurde oder dass der Anwendungs-Puffer dieser Verbindung voll ist.
Hinweis
Dass send true zurückgibt, bedeutet lediglich, dass die Daten erfolgreich in den Socket-Sende-Puffer des Betriebssystems dieser Verbindung geschrieben wurden und bedeutet nicht, dass die Daten erfolgreich an den Empfangspuffer des Gegenüber übertragen wurden, noch bedeutet es, dass die Anwendung des Gegenüber die Daten bereits aus dem lokalen Socket-Empfangspuffer gelesen hat. Jedoch kann man sagen, solange send nicht false zurückgibt und das Netzwerk nicht unterbrochen ist und der Client normal empfangen kann, sind die Daten im Grunde genommen als 100%ig an den anderen gesendet anzusehen.
Da die Daten im Socket-Sende-Puffer vom Betriebssystem asynchron an die Gegenstelle gesendet werden, bietet das Betriebssystem der Anwendungs-Ebene keinen entsprechenden Bestätigungsmechanismus, sodass die Anwendungs-Ebene nicht wissen kann, wann die Daten im Socket-Sende-Puffer zu senden begonnen haben, und die Anwendungs-Ebene kann noch weniger wissen, ob die Daten im Socket-Sende-Puffer erfolgreich gesendet wurden. Aus diesen Gründen kann Workerman keine Schnittstelle für Nachrichtenbestätigungen bereitstellen.
Wenn die Anwendung sicherstellen muss, dass jede Nachricht vom Client empfangen wird, kann eine Bestätigungsmechanismus auf Anwendungsebene hinzugefügt werden. Der Bestätigungsmechanismus kann je nach Anwendung unterschiedlich sein; selbst innerhalb derselben Anwendung kann es verschiedene Methoden zur Bestätigung geben.
Ein Beispiel für ein Chatsystem könnte ein solcher Bestätigungsmechanismus sein: Jede Nachricht wird in einer Datenbank gespeichert, und jede Nachricht hat ein "gelesen"-Feld. Der Client sendet ein Bestätigungspaket an den Server, sobald er eine Nachricht erhält, und der Server markiert die entsprechende Nachricht als gelesen. Wenn der Client mit dem Server verbunden ist (normalerweise beim Benutzer-Login oder bei einer Wiederverbindung), werden die nicht gelesen Nachrichten aus der Datenbank abgefragt. Wenn es welche gibt, werden sie an den Client gesendet, und der Client benachrichtigt den Server nach dem Empfang. Dies stellt sicher, dass jede Nachricht vom Gegenüber empfangen wird. Natürlich können Entwickler auch ihre eigene Bestätigungslogik verwenden.
Beispiel
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('websocket://0.0.0.0:8484');
$worker->onMessage = function(TcpConnection $connection, $data)
{
// Wird automatisch \Workerman\Protocols\Websocket::encode aufrufen, um die Daten als WebSocket-Protokolldaten zu verpacken und zu senden
$connection->send("hello\n");
};
// Worker ausführen
Worker::runAll();