Swoole 如何同时向多个客户端推送数据?

发布于 2022-09-12 13:06:13 字数 797 浏览 27 评论 0

问题描述:
有一台服务器需要在本地启动一个 TCP 服务,并向外暴露一个端口。
该服务器会产生一些数据,提供给需要的客户端,客户端如果需要,就去主动连接该服务器。

需求如下:

  1. 当客户端连接成功后,才会向该客户端推送数据。
  2. 当客户端断开连接时,停止向该客户端推送数据。
  3. 允许多个客户端同时连接。
  4. 因为数据源是不间断的,理论上只要客户端的连接不主动断开,服务端的数据推送就不会主动停止。

服务端伪代码如下:

<?php
// 监听服务端 9503 端口 
$server = new Swoole\Server("0.0.0.0", 9503);

/**
 * 监听连接进入事件
 */
$server->on("Connect", function ($server, $fd){
    while(true){
       // todo (获取数据)
        
       // 向客户端推送数据
       $server->send($fd, $data);
    };    
});

/**
 * 监听数据接收事件
 */
$server->on("Receive", function ($server, $fd, $from_id, $data){
    ...
});

/**
 * 监听连接关闭事件
 */
$server->on('Close', function ($server, $fd) {
    ...
});

// 启动 TCP 服务器
$server->start();

请问这个场景怎样处理更合适一些?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

星星的轨迹 2022-09-19 13:06:13
  • 如果 TCP 服务可以转为应用层协议启动,如 Websocket Server。
  • 如果不能则需要在中间加一层 Websocket Server 服务(后面简称 ws)和 TCP 服务连接。
  • 客户端使用与 ws 连接,TCP 需要推送的数据先通过 ws,ws 再转发给客户端。
  • 客户端与 ws 断开后不会再收不到推送,同时 ws 也支持 N 个客户端连接。
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文