WebSocket協(xié)議主要分為兩部分,第一部分是連接許可驗(yàn)證和驗(yàn)證后的數(shù)據(jù)交互.連接許可驗(yàn)證比較簡單,由Client發(fā)送一個(gè)類似于HTTP的請求,服務(wù)端獲取請求后根據(jù)請求的KEY生成對應(yīng)的值并返回.
連接請求內(nèi)容:
GET / HTTP/1.1
Connection:Upgrade
Host:127.0.0.1:8088
Origin:null
Sec-WebSocket-Extensions:x-webkit-deflate-frame
Sec-WebSocket-Key:puVOuWb7rel6z2AVZBKnfw==
Sec-WebSocket-Version:13
Upgrade:websocket
服務(wù)端接收請求后主要是成針對Sec-WebSocket-Key生成對就Sec-WebSocket-Accept 的key,生成Sec-WebSocket-Accept 值比較簡單就是Sha1(Sec-WebSocket-Key+258EAFA5-E914-47DA-95CA-C5AB0DC85B11)即可,服務(wù)端返回內(nèi)容:
HTTP/1.1 101 Switching Protocols
Connection:Upgrade
Server:beetle websocket server
Upgrade:WebSocket
Date:Mon, 26 Nov 2012 23:42:44 GMT
Access-Control-Allow-Credentials:true
Access-Control-Allow-Headers:content-type
Sec-WebSocket-Accept:FCKgUr8c7OsDsLFeJTWrJw6WO8Q=
請問老大, 這里的 Sec-WebSocket-Key 客戶端怎么得到呢得到后怎么發(fā)送到服務(wù)端,然后接受服務(wù)端的key呢?
<?php
use \Workerman\Worker;
use \Workerman\Connection\AsyncTcpConnection;
use \Workerman\Protocols\Websocket;
require_once __DIR__ . '/Workerman/Autoloader.php';
$task = new Worker();
$task->onWorkerStart = function($task)
{
//創(chuàng)建一個(gè)異步連接對象
$connection_to_baidu = new AsyncTcpConnection('tcp://mc.api.tbsandbox.com:80');
//onConnect 當(dāng)有客戶端連接時(shí)觸發(fā)的回調(diào)函數(shù)
$connection_to_baidu->onConnect = function($connection_to_baidu)
{
echo '---------ok----------';
$connection_to_baidu->send("GET / HTTP/1.1\r\nHost: mc.api.tbsandbox.com\r\nSec-WebSocket-Extensions:x-webkit-deflate-frame\r\nSec-WebSocket-Key:puVOuWb7rel6z2AVZBKnfw==\r\nSec-WebSocket-Version:13\r\nUpgrade:websocket\r\n".$tbkey);
};
// 執(zhí)行異步連接
$connection_to_baidu->connect();
};
// 運(yùn)行worker
Worker::runAll();