Hyperf 运行各种网络服务

这篇具有很好参考价值的文章主要介绍了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.php
namespace App\Controller;
​
use Swoole\Coroutine\Server\Connection;
use Swoole\Server as SwooleServer;
​
class TcpServer implements \Hyperf\Contract\OnReceiveInterface
{
​
    /**
     * @inheritDoc
     */
    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.php
namespace App\Controller;
​
use Swoole\WebSocket\Server;
​
class UdpServer implements \Hyperf\Contract\OnPacketInterface
{
​
    /**
     * @inheritDoc
     */
    public function onPacket($server, $data, $clientInfo): void
    {
        var_dump($clientInfo);
        $server->sendto($clientInfo['address'], $clientInfo['port'], 'Server:' . $data);
    }
}

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

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

剩下的,不管你是用 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服务【Swoole系列2.4】WebSocket服务 中的那个静态页来测试我们的 WebSocket 服务了。

总结

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

测试代码:

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

参考文档:

Hyperf文章来源地址https://www.toymoban.com/news/detail-437756.html

Hyperf

到了这里,关于Hyperf 运行各种网络服务的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 什么是“ Microsoft网络实时检查服务”(NisSrv.exe),为什么它在我的PC上运行?

    Windows 10 includes Windows Defender, which protects your PC against viruses and other threats. The “Microsoft Network Realtime Inspection Service” process, also known as NisSrv.exe, is part of Microsoft’s antivirus software. Windows 10包含Windows Defender,可保护您的PC免受病毒和其他威胁的侵害。 “ Microsoft网络实时检查服务”

    2024年02月03日
    浏览(61)
  • 网络服务——DHCP服务

    个人简介:云计算网络运维专业人员,了解运维知识,掌握TCP/IP协议,每天分享网络运维知识与技能。 座右铭:海不辞水,故能成其大;山不辞石,故能成其高。 个人主页:小李会科技的主页   目录 前言: 一.信息介绍 1.什么是DHCP服务 2.DHCP定义:   二.范围  三.工作原理

    2024年02月09日
    浏览(35)
  • 简单网络服务服务认证攻击测试

    使用工具:CentOS+Kali自带的hydra工具 1、确保虚拟机中已装有CentOS(Linux)镜像和Kali镜像(kali-linux),CentOS作为靶机,Kali作为攻击主机 2、打开CentOS虚拟机,配置IP地址( vi /etc/sysconfig/network-scripts/ifcfg-ens32),参考( bootproto=static、onboot=yes、在最后加上几行,IP地址、子网掩

    2024年02月04日
    浏览(67)
  • 【网络】UDP网络服务器

    代码的整体逻辑: UDP服务端 :udpServer.cc(服务端的调用),udpServer.hpp(服务端的实现) UDP客户端 :udpClient.cc(客户端的调用),udpClient.hpp(客户端的实现) 服务端:1.初始化服务器 2.启动服务器  作为一款服务器:要有自己的服务端口号uint16_t _port,同时网络服务器需要有对应

    2024年02月08日
    浏览(32)
  • Linux网络服务之DNS服务

    DNS 是域名系统 (Domain Name System) 的缩写,是因特网的一项核心服务,它作为可以将域名和IP地址相互 映射的一个分布式数据库,能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。 DNS 是域名系统 (Domain Name System) 的缩写,是因特网的一项核心服务,它作

    2024年02月07日
    浏览(30)
  • 【HarmonyOS】元服务服务卡片网络开发

    【】服务卡片、元服务、API6、网络请求、图片加载 一、API6服务卡片Java代码中如何进行网络请求? API6服务卡片基于FormAbility,一般元服务默认工程中的FormAbility就是MainAbility。由于FormAbility是Java语言编写的,可以使okhttp进行网络请求相关的开发。 1、添加依赖: 首先在

    2024年02月07日
    浏览(38)
  • Linux网络服务之NFS(文件共享服务)

    NFS(Network File System 网络文件服务),是一种基于 TCP/IP 传输的网络文件系统协议,最初由 Sun 公司开发。 NFS 服务的实现依赖于 RPC(Remote Process Call,远端过程调用)机制,通过使用 NFS 协议,客户机可以像访问本地目录一样访问远程服务器中的共享资源。(远端过程调用:自

    2024年02月05日
    浏览(28)
  • 对新的网络服务和应用适应不足:新引入的网络服务和应用未得到适当的安全考虑

    在新的网络技术不断涌现的今天,如何确保这些新技术的安全性至关重要。许多企业和组织都在努力跟上这一发展趋势并满足用户日益增长的需求和期望。然而, 网络安全的形势仍然严峻且复杂多变。“对新的网络服务和应用的适应不足: 新引入的网络服务和应用未得到适当的

    2024年01月17日
    浏览(32)
  • LINUX网络第五章:网络文件共享服务

    目录 一.网络文件共享服务原理内容 1.存储类型 2.应用场景  3.总结 二.FTP——文件传输协议 1.工作原理介绍 2.vsftpd软件 2.1使用ftp 2.2延伸——FileZilla ​编辑 2.3修改默认端口号 ​编辑2.4主动模式端口 2.5被动模式端口 2.6匿名用户登录 ​编辑2.7匿名用户上传 ​编辑2.8匿名用户下

    2024年01月21日
    浏览(33)
  • 【网络】UDP网络服务器简单模拟实现

    【网络】UDP网络服务器简单模拟实现 UDP的封装 : UDP网络服务器模拟实现:主要分为makefile文件进行编译 UDP客户端 :udpClient.cc(客户端的调用),udpClient.hpp(客户端的实现) UDP服务端 :udpServer.cc(服务端的调用),udpServer.hpp(服务端的实现) 创建makefile文件: makefile里可以定义变

    2024年02月08日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包