能否在一个端接受所有的房间的最新消息?

sMkb9l6r

问题描述

想实现一个监控端接受所有房间的最新消息,workman能实现么

为此你搜索到了哪些方案及不适用的原因

想实现一个监控端接受所有房间的最新消息,workman能实现么

760 3 0
3个回答

liuyan814

用GatewayWorker开发会好一点

  • sMkb9l6r 2022-12-07

    实现思路提供一下,GatewayWorker不了解,谢谢

admin

请使用 GatewayWorker

  • sMkb9l6r 2022-12-07

    实现思路提供一下,GatewayWorker不了解,谢谢

  • liuyan814 2022-12-07

    你所说的房间,实际上就是分组的功能。本身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手册。

  • liuyan814 2022-12-07

    在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;
  • liuyan814 2022-12-07

    这个群组的功能我也是最近才研究的,以上代码仅供参考。

  • sMkb9l6r 2022-12-07

    目前项目中创建了很多房间, 房间之间是不通消息的, 运行很正常. 但增加了一个需求, 加一个监控端 接受所有房间的新消息, 如果采用群组模式, 是否把所有房间都绑定一个群组, 然后可以在一个端接受消息, 但问题来了, 是不是所有的客户端都能收到群组的消息, 这方式不合适了

  • liuyan814 2022-12-07

    只有一个服务端,服务端接受所有端的数据,唯一的区别就是,你一个房间就是 一个群组, 你把用户绑定到群组后,可以发信息给某个群组中的所有用户,也可以群发所有的用户。

  • liuyan814 2022-12-07

    不是所有房间都绑定一个群组,是一个房间一个群组。

  • sMkb9l6r 2022-12-07

    感谢你的回复, 那我这个监控端的用户可以同时绑定你说的n个群组吗? 并可以就收到n个群组的新消息 ?

  • liuyan814 2022-12-07

    是的。可以绑定多个组。因为是绑定了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同时在线接收消息。

  • sMkb9l6r 2022-12-07

    我的场景和这个是相反的, 即多个 client_id 向 uid发送消息, 不知能否实现

  • sMkb9l6r 2022-12-07

    n个群组的client_id发送新消息, 有个特定的用户能收到这些新消息, 这样子的需求

  • liuyan814 2022-12-07

    那也不影响呀。你客户端在发信信息的时候,传送的参数包含,本用户ID,要发送到的UID,那服务端那边处理就行了。

  • liuyan814 2022-12-07

    “n个群组的client_id发送新消息, 有个特定的用户能收到这些新消息, 这样子的需求”。不管谁发,取决于服务端,看你服务端怎么处理了。 可以实现 的。

  • sMkb9l6r 2022-12-08

    好吧,谢谢

powerbowen
年代过于久远,无法发表回答
🔝