想实现一个监控端接受所有房间的最新消息,workman能实现么
用GatewayWorker开发会好一点
实现思路提供一下,GatewayWorker不了解,谢谢
请使用 GatewayWorker
你所说的房间,实际上就是分组的功能。本身GatewayWorker就有好几个方法,比如: Gateway::bindUid($client_id, $data['uid']); //绑定UID Gateway::joinGroup($client_id, $data['group_id']); //加入群组 Gateway::sendToGroup($data['group_id'], json_encode($ret) ); //发送到群组中所有客户端 那么实现的思路就是: 1、在你的客户端连接时,把用户的ID发送然后绑定 并且加入群组。 2、不管是哪个房间(群组)发送的消息,服务端都是可以接收的到的。 3、那么根据群组不同可以区分不同的用户,然后处理后把消息反馈给不同的群组。 你多看看GatewayWorker手册。
在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)); };
在服务端: 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'))); //向群组发信息 //Gateway::sendToGroup($group_id, $data); break;
这个群组的功能我也是最近才研究的,以上代码仅供参考。
目前项目中创建了很多房间, 房间之间是不通消息的, 运行很正常. 但增加了一个需求, 加一个监控端 接受所有房间的新消息, 如果采用群组模式, 是否把所有房间都绑定一个群组, 然后可以在一个端接受消息, 但问题来了, 是不是所有的客户端都能收到群组的消息, 这方式不合适了
只有一个服务端,服务端接受所有端的数据,唯一的区别就是,你一个房间就是 一个群组, 你把用户绑定到群组后,可以发信息给某个群组中的所有用户,也可以群发所有的用户。
不是所有房间都绑定一个群组,是一个房间一个群组。
感谢你的回复, 那我这个监控端的用户可以同时绑定你说的n个群组吗? 并可以就收到n个群组的新消息 ?
是的。可以绑定多个组。因为是绑定了UID,你的UID有多个组,那么如果单发信息的话,所有组下的都有能收到信息。 这个是官方的说明: Gateway::sendToUid 说明: void Gateway::sendToUid(mixed $uid, string $message); 向uid绑定的所有在线client_id发送数据。
注意:默认uid与client_id是一对多的关系,如果当前uid下绑定了多个client_id,则多个client_id对应的客户端都会收到消息,这类似于PC QQ和手机QQ同时在线接收消息。
我的场景和这个是相反的, 即多个 client_id 向 uid发送消息, 不知能否实现
n个群组的client_id发送新消息, 有个特定的用户能收到这些新消息, 这样子的需求
那也不影响呀。你客户端在发信信息的时候,传送的参数包含,本用户ID,要发送到的UID,那服务端那边处理就行了。
“n个群组的client_id发送新消息, 有个特定的用户能收到这些新消息, 这样子的需求”。不管谁发,取决于服务端,看你服务端怎么处理了。 可以实现 的。
好吧,谢谢
GatewayWorker
https://www.workerman.net/doc/gateway-worker/lib-gateway-functions.html
Lib\Gateway下的接口看一下
谢谢
用GatewayWorker开发会好一点
实现思路提供一下,GatewayWorker不了解,谢谢
请使用 GatewayWorker
实现思路提供一下,GatewayWorker不了解,谢谢
你所说的房间,实际上就是分组的功能。本身GatewayWorker就有好几个方法,比如:
Gateway::bindUid($client_id, $data['uid']); //绑定UID
Gateway::joinGroup($client_id, $data['group_id']); //加入群组
Gateway::sendToGroup($data['group_id'], json_encode($ret) ); //发送到群组中所有客户端
那么实现的思路就是:
1、在你的客户端连接时,把用户的ID发送然后绑定 并且加入群组。
2、不管是哪个房间(群组)发送的消息,服务端都是可以接收的到的。
3、那么根据群组不同可以区分不同的用户,然后处理后把消息反馈给不同的群组。
你多看看GatewayWorker手册。
在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));
};
在服务端:
switch($cmd) {
这个群组的功能我也是最近才研究的,以上代码仅供参考。
目前项目中创建了很多房间, 房间之间是不通消息的, 运行很正常. 但增加了一个需求, 加一个监控端 接受所有房间的新消息, 如果采用群组模式, 是否把所有房间都绑定一个群组, 然后可以在一个端接受消息, 但问题来了, 是不是所有的客户端都能收到群组的消息, 这方式不合适了
只有一个服务端,服务端接受所有端的数据,唯一的区别就是,你一个房间就是 一个群组, 你把用户绑定到群组后,可以发信息给某个群组中的所有用户,也可以群发所有的用户。
不是所有房间都绑定一个群组,是一个房间一个群组。
感谢你的回复, 那我这个监控端的用户可以同时绑定你说的n个群组吗? 并可以就收到n个群组的新消息 ?
是的。可以绑定多个组。因为是绑定了UID,你的UID有多个组,那么如果单发信息的话,所有组下的都有能收到信息。
这个是官方的说明:
Gateway::sendToUid
说明:
void Gateway::sendToUid(mixed $uid, string $message);
向uid绑定的所有在线client_id发送数据。
注意:默认uid与client_id是一对多的关系,如果当前uid下绑定了多个client_id,则多个client_id对应的客户端都会收到消息,这类似于PC QQ和手机QQ同时在线接收消息。
我的场景和这个是相反的, 即多个 client_id 向 uid发送消息, 不知能否实现
n个群组的client_id发送新消息, 有个特定的用户能收到这些新消息, 这样子的需求
那也不影响呀。你客户端在发信信息的时候,传送的参数包含,本用户ID,要发送到的UID,那服务端那边处理就行了。
“n个群组的client_id发送新消息, 有个特定的用户能收到这些新消息, 这样子的需求”。不管谁发,取决于服务端,看你服务端怎么处理了。 可以实现 的。
好吧,谢谢
GatewayWorker
https://www.workerman.net/doc/gateway-worker/lib-gateway-functions.html
Lib\Gateway下的接口看一下
谢谢