如何將下列紅框部分改成不向所有設(shè)備發(fā)送,而是向發(fā)送信息的設(shè)備發(fā)送?
$ws_worker = new Worker('Websocket://0.0.0.0:5656');
// 這里只能寫1
$ws_worker->count = 1;
// websocket server 啟動后在當(dāng)前進(jìn)程增加一個socket監(jiān)聽
$ws_worker->onWorkerStart = function($ws_worker)
{
// 增加一個Socket端口的監(jiān)聽設(shè)備發(fā)來的數(shù)據(jù)
$socket_worker = new Worker('tcp://0.0.0.0:5555');
// 當(dāng)設(shè)備發(fā)來數(shù)據(jù)時如何處理
$socket_worker->onMessage = function($connection, $data)
{
// 這里處理設(shè)備發(fā)來的數(shù)據(jù) $data
// 比如像這樣給所有的WebSocket連接轉(zhuǎn)發(fā)數(shù)據(jù)
_** global $ws_worker;
foreach($ws_worker->connections as $ws_con)
{
$ws_con->send($data);
}**_
};
// 給ws_worker添加一個屬性保存socket_worker,方便獲取
$ws_worker->socketWorker = $socket_worker;
// 執(zhí)行監(jiān)聽
$socket_worker->listen();
};
關(guān)鍵是要建立抽象的uid 與 設(shè)備連接的映射關(guān)系,參考代碼如下:
$worker = new Worker('text://0.0.0.0:3333');
$worker->count = 1;
$worker->onWorkerStart = function($worker){
//開啟一個內(nèi)部端口,方便內(nèi)部系統(tǒng)推送數(shù)據(jù).
$inner_text_worker = new Worker('text://0.0.0.0:4444');
$inner_text_worker->onMessage = function($connection, $buffer)use ($worker) {
global $worker;
//$data數(shù)組里面有uid, 這樣便于向特定uid推送數(shù)據(jù): {"uid":2, "msg":"blogdaren"}
$data = json_decode($buffer, true);
$uid = $data;
$msg = $data;
//向特定uid推送數(shù)據(jù)
$result = pushMessageByUid($uid, $msg);
//返回推送結(jié)果
$connection->send(true === $result ? 'success' : 'failed');
};
$inner_text_worker->listen();
};
//新增加一個屬性,用來保存uid到connection的映射
$worker->uidConnections = array();
//最好通過onMessage回調(diào)來生產(chǎn)uid, 為了演示用onConnect回調(diào).
$worker->onConnect = function($connection)use($worker) {
//判斷當(dāng)前客戶端是否已經(jīng)驗證
if(!isset($connection->uid))
{
//為了演示, 簡化將 $connection->id 用作uid
$connection->uid = $connection->id;
//保存uid到connection的映射,這樣可以方便的通過uid查找connection, 實現(xiàn)針對特定uid推送數(shù)據(jù)
$worker->uidConnections = $connection;
return false;
}
};
//當(dāng)客戶端連接斷開時
$worker->onClose = function($connection)use($worker) {
if(isset($connection->uid)) unset($worker->uidConnections);
};
//向特定uid推送數(shù)據(jù)
function pushMessageByUid($uid, $message)
{
global $worker;
if(isset($worker->uidConnections))
{
$connection = $worker->uidConnections;
$connection->send($message);
return true;
}
return false;
}
//運行所有的worker
Worker::runAll();