server/app/Event/WebSocket.php

76 lines
2.0 KiB
PHP

<?php
/**
* Author: cfn <cfn@leapy.cn>
*/
namespace App\Event;
use App\Model\Online;
use App\Utils\Token;
use Hyperf\Context\ApplicationContext;
use Hyperf\Contract\OnCloseInterface;
use Hyperf\Contract\OnMessageInterface;
use Hyperf\Contract\OnOpenInterface;
use Hyperf\WebSocketServer\Context;
/**
* 商户端socket
* Author: cfn <cfn@leapy.cn>
*/
class WebSocket implements OnMessageInterface, OnOpenInterface, OnCloseInterface
{
/**
* 连接关闭
* Author: cfn <cfn@leapy.cn>
* @param $server
* @param int $fd
* @param int $reactorId
* @return void
*/
public function onClose($server, int $fd, int $reactorId): void
{
$uuid = Context::get('uuid', "");
Online::leave($uuid);
}
/**
* 连接时
* Author: cfn <cfn@leapy.cn>
* @param $server
* @param $request
* @return void
*/
public function onOpen($server, $request): void
{
$token = $request->get['Authorization'];
$result = Token::parseToken(str_replace("Bearer ", "", $token));
$container = ApplicationContext::getContainer();
$redis = $container->get(\Hyperf\Redis\Redis::class);
$account = !empty($result) ? json_decode($redis->get("USER:" . $result['uuid']), true) : null;
if (!empty($account)) {
Online::live($result['uuid'], $request->fd);
Context::set('account', $account);
Context::set('uuid', $result['uuid']);
$server->push($request->fd, 'connection successful');
return;
}
$server->push($request->fd, 'connection refused');
}
/**
* 当接收到信息
* Author: cfn <cfn@leapy.cn>
* @param $server
* @param $frame
* @return void
*/
public function onMessage($server, $frame): void
{
if (strtolower($frame->data) == "ping") {
$server->push($frame->fd, 'pong');
return;
}
$server->push($frame->fd, 'Recv: ' . $frame->data);
}
}