如題:只有第一個端口(9526)可以觸發(fā)Events的onMessage方法,而9527端口只能連接上,onMessage不會被調(diào)用到
$register = new Register('text://0.0.0.0:1237');
//初始化 bussinessWorker 進程
$worker = new BusinessWorker();
// worker名稱
$worker->name = 'AppBusinessWorker';
// bussinessWorker進程數(shù)量
$worker->count = 2;
// 服務(wù)注冊地址
$worker->registerAddress = '192.168.18.9:1237';
//設(shè)置處理業(yè)務(wù)的類,此處制定Events的命名空間
$worker->eventHandler = 'app\kenny\controller\Events';
// 初始化 gateway 進程
$gateway = new Gateway("book://0.0.0.0:9526");
// 設(shè)置名稱,方便status時查看
$gateway->name = 'AppGateway';
$gateway->count = 1;
// 分布式部署時請設(shè)置成內(nèi)網(wǎng)ip(非127.0.0.1)
$gateway->lanIp = '192.168.18.9';
$gateway->startPort = 2300;
// 心跳間隔
$gateway->pingInterval = 180;
$gateway->pingNotResponseLimit = 1;
// 心跳數(shù)據(jù)
$gateway->pingData = "\n|\n";
// 服務(wù)注冊地址
$gateway->registerAddress = "192.168.18.9:1237";
$gateway->onWorkerStart = function ($gateway){
if ($gateway->id === 0){ //僅在第二個gateway中監(jiān)聽websocket
$inner_gateway = new Gateway("text://0.0.0.0:9527");
$inner_gateway->reusePort = true;
$inner_gateway->listen();
}
};
//運行所有Worker;
Worker::runAll();
請問這是GatewayWorker模型的設(shè)計所致,還是哪里使用的不對頭?
追問一下:GatewayWorker是否可以實現(xiàn)協(xié)議之間的通訊?
例如:開啟兩個gateway : gateway1(text協(xié)議) 和 gateway2(websocket) ,實現(xiàn)在兩個端口上監(jiān)聽。
在gateway1 接收消息,再從gateway2發(fā)送出去,或者從gateway2收到消息,再發(fā)到gateway1上去,當(dāng)然,這就涉及到“協(xié)議間通訊”的問題了。請問是否能夠支持呢?
http://doc2.workerman.net/multi-protocols.html
多協(xié)議支持請參考手冊
能否在onMessage回調(diào)中增加一個“協(xié)議名稱”的參數(shù),用于識別當(dāng)前數(shù)據(jù)是哪個協(xié)議下發(fā)來的,而不是通過判斷數(shù)據(jù)的結(jié)構(gòu)特點先識別出協(xié)議,再調(diào)用該協(xié)議下的decode方法?
如果有這個參數(shù)的話,那么 onMessage里可以讓代碼簡化一些,例如:
if ($protocol == 'text' ) {
$message = text::decode($buffer);
}
if ($protocol == 'websocket' ){
$message = websocket::decode($buffer);
}
//上述代碼應(yīng)該不能正常運行,是偽代碼。
https://wenda.workerman.net/question/57
這個鏈接中的方法需要判斷$buffer的格式來識別協(xié)議,當(dāng)前的版本如果要實現(xiàn)我的上述想法,應(yīng)該怎么做?框架是否可以考慮增加一個可選參數(shù),比如叫 $protocol ?
協(xié)議是和端口綁定的,可以通過端口來判斷協(xié)議類型。參考手冊 http://doc2.workerman.net/get-gateway-port.html
1:
在gateway3.0.13下,無法像(https://wenda.workerman.net/question/57)文中提到的:
$message = yourIOSProtocol::decode($buffer);
這樣調(diào)用自定義協(xié)議的解碼方法,如果用require '..../yourIOSProtocol.php',又會報重復(fù)定義的錯誤。煩請給一個示例
2:
《多協(xié)議支持》章節(jié)最底部的說明:
/支持多協(xié)議還有其他的方法,比如通過協(xié)議自身的特點區(qū)分當(dāng)前是哪種協(xié)議,然后分別調(diào)用相應(yīng)協(xié)議的解碼方法,這樣可以做到只開一個端口就可以支持多種協(xié)議的效果/
如何實現(xiàn)“分別調(diào)用相應(yīng)協(xié)議的解碼方法”呢?調(diào)用之后,怎樣找到對端,將數(shù)據(jù)發(fā)出去。
使用姿勢不正確, 原因是 gateway的用戶回調(diào)onWorkerStart 的內(nèi)部端口此時并不能與bussinessworker建立連接,按官方手冊方法玩吧,非要這么用的話,參考代碼:
$gateway->onWorkerStart = function($gateway){
if ($gateway->id === 0)
{
//step-1
$inner_gateway = new Gateway("text://0.0.0.0:9527");
$inner_gateway->reusePort = true;
$inner_gateway->lanIp = '127.0.0.1';
$inner_gateway->startPort = 3900;
$inner_gateway->lanPort = $inner_gateway->startPort + $gateway->id;
$inner_gateway->registerAddress = ;
$inner_gateway->onConnect = array($inner_gateway, 'onClientConnect');
$inner_gateway->onClose = array($inner_gateway, 'onClientClose');
$inner_gateway->onMessage = array($inner_gateway, 'onClientMessage');
$inner_gateway->listen();
//step-2
$worker = new Worker("GatewayProtocol://{$inner_gateway->lanIp}:{$inner_gateway->lanPort}");
$worker->name = 'testWorker';
$worker->onMessage = array($inner_gateway, 'onWorkerMessage');
$worker->onConnect = array($inner_gateway, 'onWorkerConnect');
$worker->onClose = array($inner_gateway, 'onWorkerClose');
$worker->listen();
//step-3
$inner_gateway->registerAddress();
}
};