目前用 Workerman 試著寫一個(gè)這樣的應(yīng)用:
[attach]91[/attach]
兩個(gè) Worker 與各自的 client 通信已經(jīng)可以了,但是 HttpWorker 與 WsWorker 如何通信?
如果ws server是gatewayWorker開發(fā)的,可以在http Worker中用GatewayClient向ws的客戶端發(fā)送數(shù)據(jù)
手冊 :http://gatewayworker-doc.workerman.net/advanced/push.html
如果是基于Worker開發(fā)
最直接的方法是在HttpWorker中模擬客戶端以websocket協(xié)議與Ws Worker通訊,websocket客戶端在workerman群共享中有,或者在github上找一個(gè)
如果Ws Worker 是單進(jìn)程的,也可以增加一個(gè)Text協(xié)議端口的監(jiān)聽,然后httpWorker以Text協(xié)議發(fā)送數(shù)據(jù)到Ws Worker
增加一個(gè)協(xié)議端口監(jiān)聽類似下面代碼
$ws_worker = new Worker('Websocket://0.0.0.0:8080');
$ws_worker->onWorkerStart = function($ws_worker)
{
// 增加一個(gè)Text協(xié)議端口的監(jiān)聽
$text_worker = new Worker('Text://0.0.0.0:9090');
$text_worker->onMessage = function($connection, $data)
{
// 這里處理Http Worker 上發(fā)來的數(shù)據(jù) $data
// 省略....
};
// 給ws_worker添加一個(gè)屬性保存text_worker
$ws_worker->textWorker = $text_worker;
// 執(zhí)行監(jiān)聽
$text_worker->listen();
};
Http Worker 中可以這樣用Text協(xié)議與Ws Worker通訊
$client = stream_socket_client("tcp://$ip:9090");
// text 協(xié)議為字符串末尾加一個(gè)換行符 \n
fwrite($client, $data."\n");
還有其它方法,比如單獨(dú)建立一個(gè)中轉(zhuǎn)Worker進(jìn)程,Http Worker 與 Ws Worker在onWorkerStart時(shí)與這個(gè)中轉(zhuǎn)Worker建立連接,然后二者就可以通過這個(gè)中轉(zhuǎn)Worker通訊了