HttpWorker 收到数据,如何广播给 WebSocketClient?

ws666

目前用 Workerman 试着写一个这样的应用:

[attach]91[/attach]

两个 Worker 与各自的 client 通信已经可以了,但是 HttpWorker 与 WsWorker 如何通信?

4117 1 0
1个回答

walkor

如果ws server是gatewayWorker开发的,可以在http Worker中用GatewayClient向ws的客户端发送数据
手册 :http://gatewayworker-doc.workerman.net/advanced/push.html

如果是基于Worker开发
最直接的方法是在HttpWorker中模拟客户端以websocket协议与Ws Worker通讯,websocket客户端在workerman群共享中有,或者在github上找一个

如果Ws Worker 是单进程的,也可以增加一个Text协议端口的监听,然后httpWorker以Text协议发送数据到Ws Worker
增加一个协议端口监听类似下面代码

$ws_worker = new Worker('Websocket://0.0.0.0:8080');
$ws_worker->onWorkerStart = function($ws_worker)
{
    // 增加一个Text协议端口的监听
    $text_worker = new Worker('Text://0.0.0.0:9090');
    $text_worker->onMessage = function($connection, $data)
    {
        // 这里处理Http Worker 上发来的数据 $data
        // 省略....
    };
    // 给ws_worker添加一个属性保存text_worker
    $ws_worker->textWorker = $text_worker;
    // 执行监听
    $text_worker->listen();
};

Http Worker 中可以这样用Text协议与Ws Worker通讯

$client = stream_socket_client("tcp://$ip:9090");
// text 协议为字符串末尾加一个换行符 \n
fwrite($client, $data."\n");

还有其它方法,比如单独建立一个中转Worker进程,Http Worker 与 Ws Worker在onWorkerStart时与这个中转Worker建立连接,然后二者就可以通过这个中转Worker通讯了

  • 暂无评论
年代过于久远,无法发表回答
🔝