如何用hyperf实现websocket服务
1创建服务器
>composer require hyperf/websocket-server
2 修改 config/autoload/server.php,增加以下配置。
```
[
[
'name' => 'ws',
'type' => Server::SERVER_WEBSOCKET,
'host' => '0.0.0.0',
'port' => 9502,
'sock_type' => SWOOLE_SOCK_TCP,
'callbacks' => [
Event::ON_HAND_SHAKE => [Hyperf\WebSocketServer\Server::class, 'onHandShake'],
Event::ON_MESSAGE => [Hyperf\WebSocketServer\Server::class, 'onMessage'],
Event::ON_CLOSE => [Hyperf\WebSocketServer\Server::class, 'onClose'],
],
],
],
];
```
3 配置路由
```
'服务端收到消息了',
'fd'=>$frame->fd,
'data'=>$frame->data
]);
$server->push($frame->fd, '收到消息了:'.$frame->data);
}
public function onClose($server, int $fd, int $reactorId): void
{
print_r([
'type'=>'服务端与客户端的连接关闭了',
'fd'=>$fd
]);
}
public function onOpen($server, Request $request): void
{
print_r([
'type'=>'服务端接入了新的连接',
'open'=>$request->fd
]);
$server->push($request->fd, '您已链接进来了'.$request->fd);
}
}
[root@iZbp13ph356ra22ldly01lZ Controller]#
```
5 创建客户端
`composer require hyperf/websocket-client`
6 创建控制器
```
[root@iZbp13ph356ra22ldly01lZ Controller]# cat IndexController.php
clientFactory->create($host,false);
// 向 WebSocket 服务端发送消息
$client->push('HttpServer 中使用 WebSocket Client 发送数据。');
// 获取服务端响应的消息,服务端需要通过 push 向本客户端的 fd 投递消息,才能获取;以下设置超时时间 2s,接收到的数据类型为 Frame 对象。
/** @var Frame $msg */
$msg = $client->recv(100);
// 获取文本数据:$res_msg->data
return([
'type'=>'客户端收到返回数据',
'result'=>$msg->data
]);
}
}
```
7 创建web客户端
```
[root@iZbp13ph356ra22ldly01lZ 47.96.13.118]# cat index.html
```
8 打开防火墙开放9501和9502端口号
9 可以通过`http://coolaf.com/tool/chattest`来测试websocket服务是否成功