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