Protocollo WebSocket
Attualmente, la versione del protocollo WebSocket di Workerman è 13.
Il protocollo WebSocket è un nuovo protocollo di HTML5. Implementa la comunicazione full duplex tra il browser e il server.
Relazione tra WebSocket e TCP
Il WebSocket, proprio come l'HTTP, è un protocollo di livello applicazione, basato sul trasporto TCP; il WebSocket stesso non ha molto a che fare con i socket e non deve essere considerato equivalente.
Handshake del protocollo WebSocket
Il protocollo WebSocket ha un processo di handshake. Durante l'handshake, il browser e il server comunicano tramite il protocollo HTTP. In Workerman, è possibile intervenire nel processo di handshake in questo modo.
Quando 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 fonte della connessione è legittima; se non lo è, chiudere la connessione
// $_SERVER['HTTP_ORIGIN'] indica da quale sito è stata avviata la connessione websocket
if($_SERVER['HTTP_ORIGIN'] != 'https://www.workerman.net')
{
$connection->close();
}
// Dentro onWebSocketConnect, $_GET e $_SERVER sono disponibili
// var_dump($_GET, $_SERVER);
};
};
Worker::runAll();
Quando 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 con il protocollo WebSocket
Il protocollo websocket per default può trasmettere solo testi in utf8; per trasmettere dati binari, si prega di leggere la sezione seguente.
Nel protocollo websocket, viene utilizzato un bit di marcatura nell'intestazione del protocollo per indicare se i dati trasmessi sono binari o testo in utf8. Il browser verifica se il bit di marcatura corrisponde al tipo di contenuto trasmesso; se non corrisponde, si verificherà un errore e la connessione verrà interrotta.
Pertanto, quando il server invia dati, deve impostare questo bit di marcatura in base al tipo di dati da trasmettere. In Workerman, se si tratta di un testo normale in utf8, è necessario impostare (questo è il valore predefinito e generalmente non è necessario impostarlo 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 non si imposta $connection->websocketType, il valore predefinito di $connection->websocketType sarà BINARY_TYPE_BLOB (cioè il tipo testo in utf8). Generalmente, le applicazioni trasmettono testi in utf8, come ad esempio i dati JSON, quindi non è necessario impostare manualmente $connection->websocketType. È necessario impostare questo attributo a BINARY_TYPE_ARRAYBUFFER solo durante la trasmissione di dati binari (come dati di immagini, dati protobuffer, ecc.).
Utilizzare workerman come client WebSocket
È possibile utilizzare la classe AsyncTcpConnection insieme al protocollo ws per far funzionare Workerman come client websocket che si connette a un server websocket remoto, completando la comunicazione in tempo reale bidirezionale.