Welcome toVigges Developer Community-Open, Learning,Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.1k views
in Technique[技术] by (71.8m points)

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

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

需求如下:

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

服务端伪代码如下:

<?php
// 监听服务端 9503 端口 
$server = new SwooleServer("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();

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)
  • 如果 TCP 服务可以转为应用层协议启动,如 Websocket Server。
  • 如果不能则需要在中间加一层 Websocket Server 服务(后面简称 ws)和 TCP 服务连接。
  • 客户端使用与 ws 连接,TCP 需要推送的数据先通过 ws,ws 再转发给客户端。
  • 客户端与 ws 断开后不会再收不到推送,同时 ws 也支持 N 个客户端连接。

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to Vigges Developer Community for programmer and developer-Open, Learning and Share
...