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

问题描述:
有一台服务器需要在本地启动一个 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();

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

阅读 2.8k
1 个回答
  • 如果 TCP 服务可以转为应用层协议启动,如 Websocket Server。
  • 如果不能则需要在中间加一层 Websocket Server 服务(后面简称 ws)和 TCP 服务连接。
  • 客户端使用与 ws 连接,TCP 需要推送的数据先通过 ws,ws 再转发给客户端。
  • 客户端与 ws 断开后不会再收不到推送,同时 ws 也支持 N 个客户端连接。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题