WebSocket协议主要分为两部分,第一部分是连接许可验证和验证后的数据交互.连接许可验证比较简单,由Client发送一个类似于HTTP的请求,服务端获取请求后根据请求的KEY生成对应的值并返回.

641221621

WebSocket协议主要分为两部分,第一部分是连接许可验证和验证后的数据交互.连接许可验证比较简单,由Client发送一个类似于HTTP的请求,服务端获取请求后根据请求的KEY生成对应的值并返回.

连接请求内容:

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

服务端接收请求后主要是成针对Sec-WebSocket-Key生成对就Sec-WebSocket-Accept 的key,生成Sec-WebSocket-Accept 值比较简单就是Sha1(Sec-WebSocket-Key+258EAFA5-E914-47DA-95CA-C5AB0DC85B11)即可,服务端返回内容:

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 客户端怎么得到呢得到后怎么发送到服务端,然后接受服务端的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)
{
//创建一个异步连接对象
$connection_to_baidu = new AsyncTcpConnection('tcp://mc.api.tbsandbox.com:80');

//onConnect 当有客户端连接时触发的回调函数
$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);

};

// 执行异步连接
$connection_to_baidu->connect();

};

// 运行worker
Worker::runAll();

3727 0 0
0个回答

年代过于久远,无法发表回答
🔝