国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

WebSocket協(xié)議

目前Workerman的WebSocke協(xié)議版本為13。

WebSocket protocol 是HTML5一種新的協(xié)議。它實現(xiàn)了瀏覽器與服務器全雙工通信。

WebSocket與TCP關(guān)系

WebSocket和HTTP一樣是一種應用層協(xié)議,都是基于TCP傳輸?shù)模琖ebSocket本身和Socket并沒有多大關(guān)系,更不能等同。

WebSocket協(xié)議握手

WebSocket協(xié)議有一個握手的過程,握手時瀏覽器和服務端是以HTTP協(xié)議通信的,在Workerman中可以這樣介入到握手過程。

當 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)
    {
        // 可以在這里判斷連接來源是否合法,不合法就關(guān)掉連接
        // $_SERVER['HTTP_ORIGIN']標識來自哪個站點的頁面發(fā)起的websocket連接
        if($_SERVER['HTTP_ORIGIN'] != 'http://www.wtbis.cn')
        {
            $connection->close();
        }
        // onWebSocketConnect 里面$_GET $_SERVER是可用的
        // var_dump($_GET, $_SERVER);
    };
};
Worker::runAll();

當 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') != 'http://www.wtbis.cn') {
        $connection->close();
    }
    var_dump($request->get());
    var_dump($request->header());
};
Worker::runAll();

WebSocket協(xié)議傳輸二進制數(shù)據(jù)

websocket協(xié)議默認只能傳輸utf8文本,如果要傳輸二進制數(shù)據(jù),請閱讀以下部分。

websocket協(xié)議中在協(xié)議頭中使用一個標記位來標記傳輸?shù)氖嵌M制數(shù)據(jù)還是utf8文本數(shù)據(jù),瀏覽器會驗證標記和傳輸?shù)膬?nèi)容類型是否符合,如果不符合則會報錯斷開連接。

所以服務端發(fā)送數(shù)據(jù)的時候需要根據(jù)傳輸?shù)臄?shù)據(jù)類型設(shè)置這個標記位,在Workerman中如果是普通utf8文本,則需要設(shè)置(默認就是此值,一般不用再手動設(shè)置)

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

如果是二進制數(shù)據(jù),則需要設(shè)置

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

注意:如果沒設(shè)置$connection->websocketType,則$connection->websocketType默認為BINARY_TYPE_BLOB(也就是utf8文本類型)。一般應用傳輸?shù)亩际莡tf8文本,例如傳輸?shù)氖莏son數(shù)據(jù),所以不用手動設(shè)置$connection->websocketType。只有在傳輸二進制數(shù)據(jù)時(例如圖片數(shù)據(jù)、protobuffer數(shù)據(jù)等)才要設(shè)置此屬性為BINARY_TYPE_ARRAYBUFFER。

把workerman作為Websocket客戶端

可以利用AsyncTcpConnection類配合ws協(xié)議讓workerman作為websocket客戶端連接遠程websocket服務端,完成雙向?qū)崟r通訊。

編輯于2024-03-13 17:37:19 完善本頁 +發(fā)起討論
贊助商