*/ 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; use Psr\SimpleCache\CacheInterface; /** * 商户端socket * Author: cfn */ class WebSocket implements OnMessageInterface, OnOpenInterface, OnCloseInterface { /** * 连接关闭 * Author: cfn * @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 * @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(); $cache = $container->get(CacheInterface::class); $account = !empty($result) ? json_decode($cache->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 * @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); } }