后端Web框架微服务RPC框架异步编程【免费下载链接】hyperf A coroutine framework that focuses on hyperspeed and flexibility. Building microservice or middleware with ease.项目地址https://gitcode.com/hyperf/hyperf点击查看免费下载Hyperf 协程框架默认内置了基于 Swoole 的TCP/UDP服务创建能力只需通过config/autoload/server.php中简单的servers配置即可挂载任意自定义协议服务。本文将围绕 Hyperf 官方文档《TCP/UDP Server》展开完整讲解 TCP 与 UDP 服务的类实现、配置写法、客户端联调方式并结合src/server与src/contract组件源码剖析事件注册与多端口监听的真实调用链帮助读者掌握在 Hyperf 中落地自定义长连接服务、私有协议服务或 UDP 数据上报服务的完整实战方案。概述Hyperf 的通用 TCP/UDP 服务能力Hyperf 的服务器体系以 Swoole Server 为核心。默认发布配置 src/server/publish/server.php 中只启用了 HTTP 服务端口 9501但 Hyperf 的servers配置支持同时注册多个监听端口每个端口可独立指定协议类型TCP/UDP、业务回调与运行参数。当配置项type取值为Server::SERVER_BASE即Hyperf\Server\ServerInterface::SERVER_BASE 3见 ServerInterface.php时框架会创建一个纯粹的Swoole\Server实例不附带 HTTP/WebSocket 协议解析交由开发者自定义onReceive、onPacket等回调来处理原始字节流。借助这一能力开发者可以轻松实现 IM 长连接网关、自定义二进制协议服务、游戏服务端、UDP 日志采集端点等场景且全程运行在 Swoole 协程环境中具备异步非阻塞与高并发处理能力。使用 TCP 服务第一步创建 TcpServer 处理类新建一个类并实现Hyperf\Contract\OnReceiveInterface接口。该接口要求实现onReceive($server, int $fd, int $reactorId, string $data): void方法其中$fd为客户端连接的文件描述符$data为接收到的原始数据。接口定义位于 OnReceiveInterface.php其$server参数可以是 Swoole Server、协程连接或 Swow Socket 等类型由运行引擎决定。?php declare(strict_types1); namespace App\Controller; use Hyperf\Contract\OnReceiveInterface; class TcpServer implements OnReceiveInterface { public function onReceive($server, int $fd, int $reactorId, string $data): void { $server-send($fd, recv: . $data); } }业务回调的核心就是拿到$server句柄后通过$server-send($fd, ...)向指定连接回写数据。上述示例实现了接收一行数据后原样回显并加recv:前缀的简单回显逻辑。第二步编写对应的 servers 配置在项目配置文件config/autoload/server.php的servers数组中新增一个端口配置项?php declare(strict_types1); use Hyperf\Server\Server; use Hyperf\Server\Event; return [ // 无关配置项已省略 servers [ [ name tcp, // 服务名可通过 ServerManager 获取 type Server::SERVER_BASE, // 服务类型纯 TCP/UDP 基础服务 host 0.0.0.0, // 监听地址 port 9504, // 监听端口 sock_type SWOOLE_SOCK_TCP, // 套接字类型TCP callbacks [ Event::ON_RECEIVE [App\Controller\TcpServer::class, onReceive], ], settings [ // 按需配置如 worker_num、open_tcp_nodelay 等 ], ], ], ];配置要点说明name当前端口服务的标识名之后可通过Hyperf\Server\ServerManager按名获取该服务的 Swoole Server 实例与端口对象type使用Server::SERVER_BASE对应 ServerInterface.php 中定义的常量值3。1为 HTTP、2为 WebSocket只有SERVER_BASE会创建原生Swoole\Server见 Server.php 的makeServer()方法sock_type直接使用 Swoole 全局常量TCP 为SWOOLE_SOCK_TCPcallbacks将Event::ON_RECEIVE字符串receive映射到业务类的onReceive方法。框架会从容器中解析该类并注册为 Swoole 事件回调见 Server.php 的registerSwooleEvents()其中对实现了MiddlewareInitializerInterface的类还会初始化核心中间件settings端口级运行参数会与顶层settings合并端口级优先见 Server.php 与 Server.php 的array_replace合并逻辑。此外针对SERVER_BASE类型Port.php 的filter()方法会自动合并open_http2_protocol false与open_http_protocol false确保纯 TCP 端口不会意外启用 HTTP 协议解析开发者无需手动设置这两项。第三步编写客户端验证连通性使用 Swoole 自带的同步客户端Swoole\Client即可快速验证?php $client new \Swoole\Client(SWOOLE_SOCK_TCP); $client-connect(127.0.0.1, 9504); $client-send(Hello World.); $ret $client-recv(); // recv:Hello World.send()发送数据后服务端onReceive被触发并回写recv:Hello World.客户端recv()收到的即为该回显内容。实际生产环境中也可以在 Hyperf 项目内基于Hyperf\Utils\Coroutine以协程方式编写异步客户端或在其他语言中直接使用原生 Socket 连接该端口。使用 UDP 服务Docker 环境下的 UDP 端口映射注意事项Docker 默认使用 TCP 协议进行端口通信。如果需要使用 UDP 协议必须显式配置 Docker 网络的 UDP 端口映射。docker run -p 9502:9502/udp image-name/udp后缀是 Docker 映射 UDP 端口的关键写法缺少该后缀时容器内 UDP 端口将无法从宿主机访问。同理若服务端同时监听 TCP 与 UDP需要分别做映射。第一步创建 UdpServer 处理类实现Hyperf\Contract\OnPacketInterface接口其方法签名为onPacket($server, $data, $clientInfo): void定义见 OnPacketInterface.php。$clientInfo为数组包含客户端地址address、端口port及server_socket等信息。?php declare(strict_types1); namespace App\Controller; use Hyperf\Contract\OnPacketInterface; class UdpServer implements OnPacketInterface { public function onPacket($server, $data, $clientInfo): void { var_dump($clientInfo); $server-sendto($clientInfo[address], $clientInfo[port], Server . $data); } }onPacket中通过$server-sendto($clientInfo[address], $clientInfo[port], ...)向来源地址回发 UDP 数据报实现收到什么回什么的 UDP 回显逻辑var_dump($clientInfo)可直观查看客户端来源信息。如果当前环境不存在OnPacketInterface接口文件可以不实现该接口。只要配置文件正确运行结果与实现接口时完全一致——框架在注册回调时只按配置中的[类名, 方法名]解析调用并不强制校验接口继承关系见 Server.php 的回调解析逻辑。第二步编写对应的 servers 配置与 TCP 配置结构一致仅将sock_type改为SWOOLE_SOCK_UDP并将回调事件替换为Event::ON_PACKET?php declare(strict_types1); use Hyperf\Server\Server; use Hyperf\Server\Event; return [ // 无关配置项已省略 servers [ [ name udp, type Server::SERVER_BASE, host 0.0.0.0, port 9505, sock_type SWOOLE_SOCK_UDP, callbacks [ Event::ON_PACKET [App\Controller\UdpServer::class, onPacket], ], settings [ // 按需配置 ], ], ], ];UDP 无连接状态因此不涉及连接建立/关闭事件核心回调只有Event::ON_PACKET。客户端可使用Swoole\Client(SWOOLE_SOCK_UDP)或socket_sendto()等方式发送数据报进行验证。事件总览TCP/UDP 服务可监听的 Swoole 事件Hyperf 通过 Event.php 将 Swoole 事件统一封装为类常量配置callbacks时直接引用即可。与 TCP/UDP 基础服务最相关的四个事件如下Event 常量实际值描述Event::ON_CONNECTconnect监听 TCP 连接建立事件UDP 无此事件Event::ON_RECEIVEreceive监听 TCP 数据接收事件对应onReceive回调Event::ON_CLOSEclose监听 TCP 连接关闭事件Event::ON_PACKETpacketUDP 数据接收事件对应onPacket回调除上述事件外Event类还定义了ON_START、ON_WORKER_START、ON_WORKER_STOP、ON_PIPE_MESSAGE、ON_TASK、ON_FINISH等进程生命周期与任务事件见 Event.php同样可用于 TCP/UDP 服务的callbacks配置例如在ON_CONNECT中记录连接日志、在ON_CLOSE中做资源清理。源码剖析Hyperf 如何启动多端口 TCP/UDP 服务理解底层实现有助于排查端口冲突、事件不触发等问题。核心流程位于 Server.php 的initServers()配置解析ServerConfig构造器见 ServerConfig.php校验servers非空并将每个配置项通过Port::build()见 Port.php转换为Port值对象字段缺省时使用默认值namehttp、type1、host0.0.0.0、port9501端口排序sortServers()Server.php将 WebSocket 端口优先、HTTP 端口次之排列其余SERVER_BASE类型端口排在最后首个端口创建主 Server遍历servers第一个端口通过makeServer()创建真正的 Swoole Server 实例——SERVER_BASE对应new SwooleServer($host, $port, $mode, $sockType)Server.php并把顶层callbacks与端口级callbacks合并后注册全部 Swoole 事件后续端口追加监听从第二个端口起通过$this-server-addlistener($host, $port, $sockType)在当前 Swoole Server 上追加监听端口Server.php每个端口拥有独立的callbacks与settings并各自注册到ServerManager。这意味着一个 Hyperf 进程可同时提供 HTTP9501、TCP9504、UDP9505等多个服务它们共享同一套进程管理、协程调度与配置体系。若使用Hyperf\Server\CoroutineServer协程服务器模式CoroutineServer.php 同样支持SERVER_BASE类型此时每个连接运行在独立协程中。常见配置补充与运行前提顶层settings与端口settings全局参数如worker_num、enable_coroutine、pid_file等写在顶层settings参考默认模板 src/server/publish/server.php端口级settings可覆盖同名项按array_replace语义合并监听多端口时的名称区分ServerManager::add($name, [$type, $port])以配置中的name为键Server.php业务代码中可按服务名区分当前请求来自哪个端口运行前提本文示例基于 Swoole 常驻内存运行模式server.php的mode默认使用SWOOLE_BASE见 src/server/publish/server.phpUDP 端口在 Docker 部署时务必使用-p 端口:端口/udp方式映射TCP 长连接场景建议在settings中按需配置open_tcp_nodelay、heartbeat_idle_time等 Swoole 原生参数以优化连接稳定性与实时性。至此从业务类编写、配置注册到客户端联调再到事件模型与底层启动原理读者已具备在 Hyperf 中独立搭建 TCP/UDP 自定义协议服务的完整能力可在此基础上扩展为私有协议解析、长连接网关或 UDP 数据采集等生产级服务。赞分享后端Web框架微服务RPC框架异步编程【免费下载链接】hyperf A coroutine framework that focuses on hyperspeed and flexibility. Building microservice or middleware with ease.项目地址https://gitcode.com/hyperf/hyperf点击查看免费下载相关推荐Hyperf 协程框架 TCP/UDP 服务开发实战指南Hyperf 协程框架 TCP/UDP 服务开发实战指南 Hyperf 框架开箱即用地提供了基于 Swoole 的 TCP/UDP 网络服务能力你不需要额外引后端微服务TBOX高并发网络通信实战从零搭建TCP/UDP服务器的完整指南TBOX高并发网络通信实战从零搭建TCP/UDP服务器的完整指南 TBOX是一个类似glib的跨平台C语言库提供了丰富的网络通信功能帮助开发者快速构建高并跨平台并发编程异步编程node-interview网络编程TCP/IP协议与HTTP服务器搭建指南node interview网络编程TCP/IP协议与HTTP服务器搭建指南 你是否在Node.js面试中遇到过网络编程相关的难题是否对TCP/IP协议的底文档教程后端上一篇大数据可视化终极指南Superset与Metabase自助分析平台对比下一篇【亲测免费】 XUnity.AutoTranslator 项目推荐创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考