hyperf框架 websocket服务端和websocket客户端

本次是为了测试hyperf框架中的websocket功能进行通讯测试 前期准备,需要安装好hyperf框架并且可以运行hyperf框架即可
1.在项目根目录安装websocket服务端 按照对应手册配置即可
https://www.hyperf.wiki/2.2/#/zh-cn/websocket-server
2.安装WebSocket 协程客户端
https://www.hyperf.wiki/2.2/#/zh-cn/websocket-client
3.重启服务 即可看到 WebSocket 服务对应的端口信息 在进行前端调试即可
这些按照手册上都可以进行成功的配置 这里主要记录一下我遇到的问题
1.我在使用WebSocket 协程客户端进行发送消息时会提示我

Websocket upgrade failed by [7102] [Http invalid protocol]

就是告诉我http协议不行 然后我就添加一个新的域名 为这个域名申请了证书 然后nginx反向代理了 WebSocket 服务对应的端口 然后用wss进行请求即可通信
2.安装hyperf视图时 安装的Blade 引擎 安装完成后启动报错 那个报错忘记截图了 大致好像是提示duncan3dc这个不存在 然后在手册上找到了 这个引擎 也进行了安装 命令是

composer require duncan3dc/blade

在安装这个的时候可能是因为我的composer版本太高 一直不成功 使用的

 composer require -W duncan3dc/blade ^4.11.0

这个命令后成功可以运行hyperf的视图

对于 Hyperf WebSocket 服务端的鉴权,你可以在 onHandShake 方法中进行实现,该方法会在 WebSocket 握手阶段触发。具体实现步骤如下: 1. 在 config/autoload 文件夹下创建一个 auth.php 配置文件,用于存储需要鉴权的用户信息。例如: ``` <?php return [ 'users' => [ [ 'username' => 'user1', 'password' => 'password1', ], [ 'username' => 'user2', 'password' => 'password2', ], ], ]; ``` 2. 在 WebSocket 控制器的 onHandShake 方法中获取客户端发送的参数(如用户名和密码),并与 auth.php 中存储的用户信息进行比对。如果验证通过,则保存用户信息到 WebSocket 的上下文中,以便后续操作使用。例如: ``` <?php declare(strict_types=1); namespace App\Controller; use Hyperf\WebSocketServer\Context; use Hyperf\WebSocketServer\Sender; use Hyperf\WebSocketServer\Annotation\WebSocket; use Hyperf\WebSocketServer\Contract\RequestInterface; use Hyperf\WebSocketServer\Contract\ResponseInterface; /** * @WebSocket */ class AuthController { public function onHandShake(RequestInterface $request, ResponseInterface $response): void { $username = $request->get('username'); $password = $request->get('password'); // 从配置文件中获取用户信息 $users = config('auth.users', []); // 验证用户信息 foreach ($users as $user) { if ($user['username'] === $username && $user['password'] === $password) { // 验证通过,保存用户信息到上下文中 Context::set('user', $user); return; } } // 验证失败,关闭 WebSocket 连接 $sender = make(Sender::class, ['response' => $response]); $sender->close(); } } ``` 3. 在其他 WebSocket 控制器的方法中,可以通过 Context::get('user') 获取已经鉴权的用户信息,进行后续操作。例如: ``` <?php declare(strict_types=1); namespace App\Controller; use Hyperf\Di\Annotation\Inject; use Hyperf\WebSocketServer\Context; use Hyperf\WebSocketServer\Annotation\WebSocket; /** * @WebSocket */ class ChatController { /** * @Inject * @var \Hyperf\WebSocketServer\Sender */ protected $sender; public function onMessage($fd, $data) { $user = Context::get('user'); if (! $user) { // 用户未鉴权,无法进行操作 return; } // 用户已鉴权,进行后续操作 // ... } } ``` 通过以上步骤,你就可以在 Hyperf WebSocket 服务端实现用户鉴权。当然,具体实现方式可以根据自己的业务需求进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值