想實(shí)現(xiàn)一個(gè)監(jiān)控端接受所有房間的最新消息,workman能實(shí)現(xiàn)么
想實(shí)現(xiàn)一個(gè)監(jiān)控端接受所有房間的最新消息,workman能實(shí)現(xiàn)么
請(qǐng)使用 GatewayWorker
你所說的房間,實(shí)際上就是分組的功能。本身GatewayWorker就有好幾個(gè)方法,比如:
Gateway::bindUid($client_id, $data['uid']); //綁定UID
Gateway::joinGroup($client_id, $data['group_id']); //加入群組
Gateway::sendToGroup($data['group_id'], json_encode($ret) ); //發(fā)送到群組中所有客戶端
那么實(shí)現(xiàn)的思路就是:
1、在你的客戶端連接時(shí),把用戶的ID發(fā)送然后綁定 并且加入群組。
2、不管是哪個(gè)房間(群組)發(fā)送的消息,服務(wù)端都是可以接收的到的。
3、那么根據(jù)群組不同可以區(qū)分不同的用戶,然后處理后把消息反饋給不同的群組。
你多看看GatewayWorker手冊(cè)。
在HTML中:
let ws = new WebSocket("ws://127.0.0.1:2084");
ws.onopen = function() { //綁定連接事件
console.log("連接成功");
let uid = $("#uid").val();
let car_id= $("#car_id").val();
let group_id= $("#group_id").val();
var data = {
"action":"bind",
"uid":uid,
"car_id":car_id,
"group_id":group_id
};
ws.send(JSON.stringify(data));
};
在服務(wù)端:
switch($cmd) {
case "bind":
Gateway::bindUid($client_id, $data['uid']); //綁定UID
Gateway::joinGroup($client_id, $data['group_id']); //加入群組
Gateway::sendToClient($client_id,json_encode(array('msg'=>'bind success')));
//向群組發(fā)信息
//Gateway::sendToGroup($group_id, $data);
break;
目前項(xiàng)目中創(chuàng)建了很多房間, 房間之間是不通消息的, 運(yùn)行很正常. 但增加了一個(gè)需求, 加一個(gè)監(jiān)控端 接受所有房間的新消息, 如果采用群組模式, 是否把所有房間都綁定一個(gè)群組, 然后可以在一個(gè)端接受消息, 但問題來了, 是不是所有的客戶端都能收到群組的消息, 這方式不合適了
只有一個(gè)服務(wù)端,服務(wù)端接受所有端的數(shù)據(jù),唯一的區(qū)別就是,你一個(gè)房間就是 一個(gè)群組, 你把用戶綁定到群組后,可以發(fā)信息給某個(gè)群組中的所有用戶,也可以群發(fā)所有的用戶。
是的。可以綁定多個(gè)組。因?yàn)槭墙壎薝ID,你的UID有多個(gè)組,那么如果單發(fā)信息的話,所有組下的都有能收到信息。
這個(gè)是官方的說明:
Gateway::sendToUid
說明:
void Gateway::sendToUid(mixed $uid, string $message);
向uid綁定的所有在線client_id發(fā)送數(shù)據(jù)。
注意:默認(rèn)uid與client_id是一對(duì)多的關(guān)系,如果當(dāng)前uid下綁定了多個(gè)client_id,則多個(gè)client_id對(duì)應(yīng)的客戶端都會(huì)收到消息,這類似于PC QQ和手機(jī)QQ同時(shí)在線接收消息。
“n個(gè)群組的client_id發(fā)送新消息, 有個(gè)特定的用戶能收到這些新消息, 這樣子的需求”。不管誰發(fā),取決于服務(wù)端,看你服務(wù)端怎么處理了。 可以實(shí)現(xiàn) 的。