swoole学习笔记-im-server2

    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了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值