🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# onHandShake WebSocket建立连接后进行握手。WebSocket服务器已经内置了`handshake`,如果用户希望自己进行握手处理,可以设置`onHandShake`事件回调函数。 ~~~ function onHandShake(swoole_http_request $request, swoole_http_response $response); ~~~ * `onHandShake`事件回调是可选的 * 设置onHandShake回调函数后不会再触发`onOpen`事件,需要应用代码自行处理 * `onHandShake`中必须调用`response->status`设置状态码为101并调用end响应, 否则会握手失败. * 内置的握手协议为`Sec-WebSocket-Version: 13`,低版本浏览器需要自行实现握手 > 1.8.1或更高版本可以使用`server->defer`调用`onOpen`逻辑 注意: 仅仅你需要自行处理handshake的时候再设置这个回调函数,如果您不需要“自定义”握手过程,那么不要设置该回调,用swoole默认的握手即可。下面是“自定义”handshake事件回调函数中必须要具备的: ~~~ $server->on('handshake', function (\swoole_http_request $request, \swoole_http_response $response) { // print_r( $request->header ); // if (如果不满足我某些自定义的需求条件,那么返回end输出,返回false,握手失败) { // $response->end(); // return false; // } // websocket握手连接算法验证 $secWebSocketKey = $request->header['sec-websocket-key']; $patten = '#^[+/0-9A-Za-z]{21}[AQgw]==$#'; if (0 === preg_match($patten, $secWebSocketKey) || 16 !== strlen(base64_decode($secWebSocketKey))) { $response->end(); return false; } echo $request->header['sec-websocket-key']; $key = base64_encode(sha1( $request->header['sec-websocket-key'] . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11', true )); $headers = [ 'Upgrade' => 'websocket', 'Connection' => 'Upgrade', 'Sec-WebSocket-Accept' => $key, 'Sec-WebSocket-Version' => '13', ]; // WebSocket connection to 'ws://127.0.0.1:9502/' // failed: Error during WebSocket handshake: // Response must not include 'Sec-WebSocket-Protocol' header if not present in request: websocket if (isset($request->header['sec-websocket-protocol'])) { $headers['Sec-WebSocket-Protocol'] = $request->header['sec-websocket-protocol']; } foreach ($headers as $key => $val) { $response->header($key, $val); } $response->status(101); $response->end(); }); ~~~