Protocole WebSocket

Actuellement, la version du protocole WebSocket de Workerman est 13.

Le protocole WebSocket est un nouveau protocole de HTML5. Il permet une communication en duplex intégral entre le navigateur et le serveur.

Relation entre WebSocket et TCP

WebSocket, tout comme HTTP, est un protocole de couche applicative, basé sur le transport TCP. WebSocket n'est pas fondamentalement lié aux sockets et ne peut pas être considéré comme équivalent.

Établissement de la connexion WebSocket

Le protocole WebSocket inclut un processus de handshake, où le navigateur et le serveur communiquent via le protocole HTTP. Dans Workerman, cela peut être intégré dans le processus de handshake de cette manière.

Lorsque 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)
    {
        // Vous pouvez ici vérifier si la source de la connexion est valide,
        // sinon fermez la connexion.
        // $_SERVER['HTTP_ORIGIN'] indique de quel site provient la connexion websocket.
        if($_SERVER['HTTP_ORIGIN'] != 'https://www.workerman.net')
        {
            $connection->close();
        }
        // Dans onWebSocketConnect, $_GET et $_SERVER sont disponibles.
        // var_dump($_GET, $_SERVER);
    };
};
Worker::runAll();

Lorsque 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();

Transmission de données binaires via le protocole WebSocket

Le protocole websocket ne permet par défaut que la transmission de texte en utf8. Si vous souhaitez transmettre des données binaires, veuillez lire la partie suivante.

Dans le protocole websocket, un indicateur est utilisé dans l'en-tête du protocole pour signaler si les données transmises sont binaires ou des données texte en utf8. Le navigateur vérifiera que l'indicateur correspond au type de contenu transmis, et si ce n'est pas le cas, une erreur sera retournée et la connexion sera interrompue.

Ainsi, lorsque le serveur envoie des données, il doit définir cet indicateur en fonction du type de données à transmettre. Dans Workerman, si ce sont des textes utf8 normaux, cet indicateur doit être défini (la valeur par défaut est déjà celle-ci, vous n'avez généralement pas besoin de le définir manuellement).

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

S'il s'agit de données binaires, cet indicateur doit être défini sur :

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

Remarque : Si $connection->websocketType n'est pas défini, sa valeur par défaut est BINARY_TYPE_BLOB (c'est-à-dire le type texte utf8). En général, les applications transmettent des textes utf8, par exemple des données json, donc vous n'avez pas besoin de définir manuellement $connection->websocketType. Ce n'est que lors de la transmission de données binaires (comme les données d'image, les données protobuffer, etc.) que cette propriété doit être définie sur BINARY_TYPE_ARRAYBUFFER.

Utiliser Workerman comme client WebSocket

Vous pouvez utiliser la classe AsyncTcpConnection en combinaison avec le protocole ws pour faire de Workerman un client WebSocket se connectant à un serveur WebSocket distant, réalisant ainsi une communication en temps réel bidirectionnelle.