我的编程空间,编程开发者的网络收藏夹
学习永远不晚

【Swoole系列6.3】Hyperf 运行各种网络服务

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

【Swoole系列6.3】Hyperf 运行各种网络服务

Hyperf 运行各种网络服务

简单地运行起普通的 HTTP 服务之后,今天我们再来学习一下如何使用 Hyperf 运行 TCP/UDP 以及 WebSocket 服务。

之前我们通过普通的 Swoole 都已经搭建起过这些服务,其实和 HTTP 服务都差不多,只是修改一些参数或者监听的事件而已。在框架中,实现这些服务也是类似的,而且会更加简单,只需要进行一些简单的配置并给上监听事件的对象方法即可。毕竟原理都是相通的。

TCP/UDP

在上一篇文章的学习中,我们其实就接触过一个配置文件,那就是 config/autoload/server.php 这个配置文件。当时我们是为了配置模板 View 对它下面两个参数的内容进行了配置,不知道大家有没有看这个文件的另一个参数数组 servers。

'servers' => [    [        'name' => 'http',        'type' => Server::SERVER_HTTP,        'host' => '0.0.0.0',        'port' => 9501,        'sock_type' => SWOOLE_SOCK_TCP,        'callbacks' => [            Event::ON_REQUEST => [Hyperf\HttpServer\Server::class, 'onRequest'],        ],    ],],

看出来什么端倪了吗?这就是一个服务配置呀。既然是这样的话,那么我们能不能通过它来配置其它的服务类型呢?当然是没问题的。

[    'name' => 'tcp',    'type' => Server::SERVER_BASE,    'host' => '0.0.0.0',    'port' => 9502,    'sock_type' => SWOOLE_SOCK_TCP,    'callbacks' => [        Event::ON_RECEIVE => [\App\Controller\TcpServer::class, 'onReceive'],        Event::ON_CLOSE => [\App\Controller\TcpServer::class, 'onClose'],    ],],[    'name' => 'udp',    'type' => Server::SERVER_BASE,    'host' => '0.0.0.0',    'port' => 9503,    'sock_type' => SWOOLE_SOCK_UDP,    'callbacks' => [        Event::ON_PACKET => [\App\Controller\UdpServer::class, 'onPacket'],    ],],

我们添加了两个配置,分别就是 TCP 和 UDP 服务的配置,它们使用的 type 类型都是 Server::SERVER_BASE ,但 sock_type 则分别使用的是 SWOOLE_SOCK_TCP 和 SWOOLE_SOCK_UDP 。然后分别监听 9502 和 9503 两个端口,并且去指定不同的事件回调方法。注意,这里的 callbacks 中的事件回调类和方法不是框架默认的,是我们自定义的。

// app/Controller/TcpServer.phpnamespace App\Controller;use Swoole\Coroutine\Server\Connection;use Swoole\Server as SwooleServer;class TcpServer implements \Hyperf\Contract\OnReceiveInterface{        public function onReceive($server, int $fd, int $reactorId, string $data): void    {        $server->send($fd, 'recv:' . $data);    }    public function onClose($server, int $fd, int $reactorId){        echo '连接关闭:' . $fd . ',' . $reactorId;    }}// app/Controller/UdpServer.phpnamespace App\Controller;use Swoole\WebSocket\Server;class UdpServer implements \Hyperf\Contract\OnPacketInterface{        public function onPacket($server, $data, $clientInfo): void    {        var_dump($clientInfo);        $server->sendto($clientInfo['address'], $clientInfo['port'], 'Server:' . $data);    }}

只要是跟我们之前一起学习过普通 Swoole 搭建这些服务的同学,对这一块应该不会很难理解。当时我们是直接将事件监听及操作写在回调函数中,而在这里,在框架中,则是通过 callbacks 这个回调数组的方式配置到配置文件中,然后当服务监听这些程序的时候,再将对应的监听类的方法传递给事件监听函数。

好了,现在运行起服务之后,你会发现 Hyperf 框架可以同时监听多个端口,之前我们的 HTTP 端口是可以正常访问的,同时,这些新定义的 TCP/UDP 服务也是没问题的。命令行中,我们也可以看到下面这样的信息表示监听端口开启。

fd8b29553833e795fa1155dac5e6ad0e.png

剩下的,不管你是用 telnet/nc 命令,还是用之前我们写过的客户端程序,都可以进行测试啦。

WebSocet

使用 Hyperf 的 WebSocket 客户端是需要额外的组件的,我们可以通过 Composer 来进行安装。

composer require hyperf/websocket-server

安装完成后,就可以去配置服务了,依然还是在 config/autoload/server.php 中。

[    'name' => 'ws',    'type' => Server::SERVER_WEBSOCKET,    'host' => '0.0.0.0',    'port' => 9504,    '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'],    ],],

然后,我们就可以创建相关的控制器,注意,WebSocket 使用的事件监听程序是组件自带的,但是真实到达的控制器,还是需要我们实现的,这个服务其实和 HTTP 是很类似的。

namespace App\Controller;use Swoole\Http\Request;use Swoole\Http\Response;use Swoole\WebSocket\Frame;use Swoole\WebSocket\Server;class WebSocketController implements \Hyperf\Contract\OnMessageInterface, \Hyperf\Contract\OnCloseInterface, \Hyperf\Contract\OnOpenInterface{    public function onMessage($server, Frame $frame): void    {        $server->push($frame->fd, 'Recv: ' . $frame->data);    }    public function onClose($server, int $fd, int $reactorId): void    {        var_dump('closed');    }    public function onOpen($server, Request $request): void    {        $server->push($request->fd, 'Opened');    }}

控制器中实现对应的接口及方法,然后我们就去定义路由。

Router::addServer('ws', function () {    Router::get('/', 'App\Controller\WebSocketController');});

这个路由的方法是 addServer() ,可以看做是增加一个 ws 协议的服务路由组。然后指定的是我们之前定义好的那个控制器。

最后,没别的多说的了吧,重新启动服务,你会看到现在我们的服务程序已经监听了 4 个端口了,并且也可以直接使用之前我们在 【Swoole系列2.4】WebSocket服务https://mp.weixin.qq.com/s/-w-48E3xXEpC3fezpqd4-Q 中的那个静态页来测试我们的 WebSocket 服务了。

总结

是不是总体感觉来看是要比纯手写 Swoole 的这些服务更方便一些呀。毕竟框架走了一层封装之后还是让我们能更容易去使用这些服务了。如果你在日常工作中有这方面的需求,那还是需要更深入地去官方文档中进行更加详细的学习。

测试代码:

https://github.com/zhangyue0503/swoole/tree/main/6.%E6%A1%86%E6%9E%B6/hyperf-skeleton

参考文档:

https://hyperf.wiki/2.2/#/zh-cn/tcp-server

https://hyperf.wiki/2.2/#/zh-cn/websocket-server

来源地址:https://blog.csdn.net/zhangyue0503/article/details/127063962

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

【Swoole系列6.3】Hyperf 运行各种网络服务

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

win7系统怎么解决诊断网络提示诊断策略服务未运行问题

这篇文章主要为大家展示了“win7系统怎么解决诊断网络提示诊断策略服务未运行问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“win7系统怎么解决诊断网络提示诊断策略服务未运行问题”这篇文章吧。
2023-06-28

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录