Protocollo WebSocket

Attualmente, la versione del protocollo WebSocket in Workerman è la 13.

Il protocollo WebSocket è un nuovo protocollo in HTML5. Implementa una comunicazione full-duplex tra il browser e il server.

Relazione tra WebSocket e TCP

Il WebSocket, come l'HTTP, è un protocollo di livello applicativo basato sulla trasmissione TCP. Il WebSocket non ha molto a che fare con il Socket e non può essere considerato la stessa cosa.

Handshake del protocollo WebSocket

Il protocollo WebSocket prevede un processo di handshake, durante il quale il browser e il server comunicano tramite il protocollo HTTP. In Workerman, è possibile intervenire in questo processo di handshake in questo modo.

Per 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)
    {
        // È possibile verificare qui se la connessione proviene da una fonte legittima e chiuderla in caso contrario
        // $_SERVER['HTTP_ORIGIN'] indica da quale sito è stata avviata la connessione WebSocket
        if($_SERVER['HTTP_ORIGIN'] != 'https://www.workerman.net')
        {
            $connection->close();
        }
        // $_GET e $_SERVER sono accessibili all'interno di onWebSocketConnect
        // var_dump($_GET, $_SERVER);
    };
};
Worker::runAll();

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

Trasmissione di dati binari tramite il protocollo WebSocket

Il protocollo WebSocket, per impostazione predefinita, può trasmettere solo testo UTF-8. Se si desidera trasmettere dati binari, leggere la seguente sezione.

Nel protocollo WebSocket, nell'intestazione del protocollo, viene utilizzato un flag per indicare se vengono trasmessi dati binari o dati di testo in UTF-8. Il browser verifica che il flag corrisponda al tipo di dati trasmessi e, in caso contrario, disconnette la connessione. Pertanto, quando il server invia i dati, è necessario impostare questo flag in base al tipo di dati trasmessi. In Workerman, se si tratta di un testo UTF-8 normale, è necessario impostare (di default è già impostato e di solito non è necessario farlo manualmente)

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

Se si tratta di dati binari, è necessario impostare

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

Nota: Se $connection->websocketType non è impostato, allora per impostazione predefinita sarà BINARY_TYPE_BLOB (ossia tipo di testo UTF-8). Di solito le applicazioni trasmettono testi UTF-8, ad esempio dati JSON, quindi non è necessario impostare manualmente $connection->websocketType. Solo nel caso di trasmissione di dati binari (ad esempio dati delle immagini, dati protobuffer, ecc.) è necessario impostare questa proprietà su BINARY_TYPE_ARRAYBUFFER.

Utilizzo di workerman come client WebSocket

Utilizzando la classe AsyncTcpConnection insieme al protocollo ws, è possibile fare in modo che workerman agisca come client WebSocket per connettersi a un server WebSocket remoto e completare la comunicazione bidirezionale in tempo reale.