Swoole通过addlistener方法实现单进程内多端口监听,支持TCP、UDP、SSL等不同协议。1. 创建主服务后调用addlistener可绑定多个IP:Port,每个端口独立设置协议类型;2. 不同端口可分别处理TCP、UDP或SSL连接,适用于常规通信、广播及加密场景;3. 在receive回调中通过connection_info获取端口信息,实现基于来源端口的差异化业务逻辑;4. 每个swoole_server_port对象可单独注册事件回调,SSL端口需配置证书文件。该机制便于构建集API服务、实时推送与管理功能于一体的综合性网络应用。

在 Swoole 中让一个服务监听多个端口非常简单,只需要在创建 Server 实例后,通过调用 addlistener 方法添加额外的监听端口即可。这样可以在同一个进程内处理不同协议或用途的连接。
1. 基本实现方式:主服务 + 多端口监听
使用 SwooleServer 创建主服务后,调用 addlistener 可绑定多个 IP:Port 组合,每个端口可独立设置协议类型(如 TCP、UDP、SSL 等)。
addlistener('0.0.0.0', 9502, SWOOLE_SOCK_TCP);// 添加第三个端口,支持 SSL$server->addlistener('0.0.0.0', 9503, SWOOLE_SOCK_TCP | SWOOLE_SSL);// 设置回调函数(主端口)$server->on('connect', function ($serv, $fd) { echo "Client: {$fd} connected to port " . $serv->ports[0]->port . "n";});$server->on('receive', function ($serv, $fd, $reactor_id, $data) { $port = $serv->ports[0]->port; $serv->send($fd, "Received on port {$port}: " . trim($data) . "n");});// 第二个端口的回调(可单独设置)$port2 = $server->ports[1];$port2->on('receive', function ($port, $fd, $reactor_id, $data) { $serv = $port->getServer(); $serv->send($fd, "Reply from port 9502: " . trim($data) . "n");});// 第三个端口(SSL)的回调$port3 = $server->ports[2];$port3->on('receive', function ($port, $fd, $reactor_id, $data) { $serv = $port->getServer(); $serv->send($fd, "Secure reply from port 9503: " . trim($data) . "n");});$server->start();
2. 不同端口使用不同协议
Swoole 支持为每个监听端口设置不同的传输协议,比如一个端口处理 TCP,另一个处理 UDP 或 Websocket。
主端口(TCP):用于常规通信额外端口(UDP):适合广播或低延迟场景SSL 端口:提供加密通信
// 添加 UDP 端口$server->addlistener('0.0.0.0', 9601, SWOOLE_SOCK_UDP);$udpPort = $server->ports[3];$udpPort->on('packet', function ($port, $data, $clientInfo) { echo "UDP packet from {$clientInfo['address']}:{$clientInfo['port']} n"; $port->send($clientInfo['address'], $clientInfo['port'], "UDP echo: " . $data);});
3. 区分来源端口处理逻辑
在 receive 回调中可以通过判断连接所属的 port 对象来执行不同业务逻辑。
$server->on('receive', function ($serv, $fd, $reactor_id, $data) { $info = $serv->connection_info($fd); $port = $info['server_port']; switch ($port) { case 9501: $serv->send($fd, "Processing as service An"); break; case 9502: $serv->send($fd, "Processing as service Bn"); break; case 9503: $serv->send($fd, "Processing secure requestn"); break; default: $serv->send($fd, "Unknown portn"); }});
4. 配置说明与注意事项
使用多端口时注意以下几点:
每个 addlistener 添加的端口都会生成一个新的 swoole_server_port 对象,可通过 $server->ports 访问每个 port 可独立设置 onConnect / onClose / onReceive / onPacket 等事件回调SSL 端口需提前配置证书:
// SSL 配置示例$server->set([ 'ssl_cert_file' => '/path/to/ssl.cert', 'ssl_key_file' => '/path/to/ssl.key',]);
基本上就这些。Swoole 的多端口机制灵活高效,适合构建多功能网络服务,比如同时提供 API 接口、实时推送和管理端口。
以上就是Swoole怎么让一个服务监听多个端口的详细内容,更多请关注php中文网其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/195415.html
微信扫一扫
支付宝扫一扫