public function handle($event){
var_dump("握手事件触发");
$request=$event['request'];
$response=$event['response'];
$redis=$event['redis'];
var_dump($request->header);
//1.验证token是否正确,成功就握手,否则直接断开连接
//通过判断websocket请求头当中是否有一个有效token
if (!isset($request->header['sec-websocket-protocol'])) {
// $response->end();
// return false;
//jwt验证
}
$flag=0;
// try{
// $token=$request->header['sec-websocket-protocol'];
// $key='peter123456';
// $arr=JWT::decode($token,$key,['HS256']);
// var_dump($arr);
$userInfo=$arr->data;
$key=$userInfo->service_url;
//绑定路由关系,通过id来查找fd
$redis->hset($key,$userInfo->uid,json_encode(['fd'=>$request->fd,'name'=>$userInfo->name]));
// }catch (SignatureInvalidException $e) { //签名错误
// $flag=1;
// var_dump($e->getMessage());
// }catch (ExpiredException $e){ //token过期
// $flag=1;
// var_dump($e->getMessage());
// }catch (Exception $e){
// $flag=1;
// var_dump($e->getMessage());
// }
// if($flag>0){
// $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();
}
在中间那部分代码没有注释时,报错
[2019-04-05 17:17:36 $98833.0] WARNING swManager_check_exit_status: worker#1[pid=98835] abnormal exit, status=255, signal=0
注释掉后正常了
127.0.0.1:9800
websocket.html:22 已经打开了websocket连接,可以进行实时通信了
经过反复排查是因为JWT没有用composer引进来。。。
MAC下安装composer
https://www.jianshu.com/p/fd1b53df3f4b
composer update就OK了