WebSocket-Protokoll

Aktuell ist die WebSocket-Protokollversion von Workerman 13.

Das WebSocket-Protokoll ist ein neues Protokoll von HTML5. Es ermöglicht eine vollduplex Kommunikation zwischen Browser und Server.

Beziehung zwischen WebSocket und TCP

WebSocket ist wie HTTP ein Anwendungsprotokoll, das auf TCP-Übertragung basiert. WebSocket selbst hat nicht viel mit Sockets zu tun und kann nicht gleichgesetzt werden.

Handshake des WebSocket-Protokolls

Das WebSocket-Protokoll hat einen Handshake-Prozess, in dem der Browser und der Server über das HTTP-Protokoll kommunizieren. In Workerman kann der Handshake-Prozess wie folgt eingeleitet werden.

Wenn workerman <= 4.1

<?php
require_once __DIR__ . '/vendor/autoload.php';

use Workerman\Connection\TcpConnection;
use Workerman\Worker;

$ws = new Worker('websocket://0.0.0.0:8181');
$ws->onConnect = function($connection)
{
    $connection->onWebSocketConnect = function($connection , $httpBuffer)
    {
        // Hier kann überprüft werden, ob die Verbindung legitim ist; andernfalls wird die Verbindung geschlossen.
        // $_SERVER['HTTP_ORIGIN'] gibt an, von welcher Seite die WebSocket-Verbindung initiiert wurde.
        if($_SERVER['HTTP_ORIGIN'] != 'https://www.workerman.net')
        {
            $connection->close();
        }
        // In onWebSocketConnect sind $_GET $_SERVER verfügbar.
        // var_dump($_GET, $_SERVER);
    };
};
Worker::runAll();

Wenn workerman >= 5.0

<?php
require_once __DIR__ . '/vendor/autoload.php';

use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
use Workerman\Worker;

$worker = new Worker('websocket://0.0.0.0:12345');
$worker->onWebSocketConnect = function (TcpConnection $connection, Request $request) {
    if ($request->header('origin') != 'https://www.workerman.net') {
        $connection->close();
    }
    var_dump($request->get());
    var_dump($request->header());
};
Worker::runAll();

Übertragung von Binärdaten im WebSocket-Protokoll

Das WebSocket-Protokoll kann standardmäßig nur utf8-Text übertragen. Wenn Binärdaten übertragen werden sollen, lesen Sie bitte den folgenden Abschnitt.

Im WebSocket-Protokoll wird ein Flag im Protokollkopf verwendet, um anzuzeigen, ob Binärdaten oder utf8-Textdaten übertragen werden. Der Browser prüft, ob das Flag mit dem Typ der übertragenen Inhalte übereinstimmt. Andernfalls wird die Verbindung mit einer Fehlermeldung getrennt.

Daher muss der Server beim Senden von Daten dieses Flag entsprechend dem Datentyp setzen. In Workerman muss für normalen utf8-Text Folgendes gesetzt werden (dieser Wert ist standardmäßig bereits gesetzt, in der Regel ist keine manuelle Einstellung erforderlich):

use Workerman\Protocols\Websocket;
$connection->websocketType = Websocket::BINARY_TYPE_BLOB;

Wenn es sich um Binärdaten handelt, muss Folgendes gesetzt werden:

use Workerman\Protocols\Websocket;
$connection->websocketType = Websocket::BINARY_TYPE_ARRAYBUFFER;

Hinweis: Wenn $connection->websocketType nicht gesetzt ist, ist der Standardwert für $connection->websocketType BINARY_TYPE_BLOB (also der utf8-Texttyp). In der Regel werden bei Anwendungen utf8-Texte übertragen, beispielsweise JSON-Daten, sodass $connection->websocketType nicht manuell festgelegt werden muss. Nur wenn Binärdaten übertragen werden (z. B. Bilddaten, Protobuf-Daten usw.), muss diese Eigenschaft auf BINARY_TYPE_ARRAYBUFFER gesetzt werden.

Workerman als WebSocket-Client verwenden

Sie können die AsyncTcpConnection-Klasse in Kombination mit dem ws-Protokoll verwenden, um Workerman als WebSocket-Client zu nutzen, um eine Verbindung zu einem entfernten WebSocket-Server herzustellen und eine bidirektionale Echtzeitkommunikation zu ermöglichen.