workman倒计时30秒进行ws前后端交互,怎么做?

jy03204340

如果是前段进行倒计时触发,所有在线用户都会发送向后端发送消息,而后端倒计时触发则直接推送,不需要用户前段发送消息,这个具体怎么做?

4189 2 0
2个回答

walkor

不了解为何有这种需求

前端定时吧,简单,不容易出错

  • jy03204340 2014-12-27

    我的需求是这样,有一个房间,房主和其他人多个人,房主创建这个房间的有效时间为30分钟,当30分钟后,关闭整个房间,发送消息给在线的人,说该房间已过期。
    如果用前段定时器,并且这些人都在线,究竟是谁去向后端发送消息,如果这些人同时发送不是重复发送消息了么?求解答

walkor

我的需求是这样,有一个房间,房主和其他人多个人,房主创建这个房间的有效时间为30分钟,当30分钟后,关闭整个房间,发送消息给在线的人,说该房间已过期。
如果用前段定时器,并且这些人都在线,究竟是谁去向后端发送消息,如果这些人同时发送不是重复发送消息了么?求解答

下次提问可以像这样把应用场景说下,不同的场景,不同的做法,不说需求场景真不好回答。
这种情况应该服务端计时,在创建房间的时候设置一个定时任务,伪代码如下

\Man\Core\Lib\Task::add(30*60, 
    function () use ($room_id){
         // 获取所有该$room_id房间的client_id, get_client_id_arr是你自己的函数
        $all_client_id_array = get_client_id_arr($room_id);
         // 提示房间关闭的包
        $close_room_message = json_encode(xxxxxx);
        // 发送包
        \Lib\Gateway::sendToAll($all_client_id_array, $close_room_message);
        // 关闭所有客户端连接
        foreach($all_client_id_array as $client_id)
        {
            \Lib\Gateway::kickClient($client_id);
        }
    },
    false
);
  • jy03204340 2015-01-04

    首先,谢谢walker你的回答
    另外,补充说明,场景:5人房间组队打游戏,有人在房间内,有人在大厅,需求:有一个预定的开始时间,达到这个时间时向在线用户提示“该队伍已过期”,不论在房间内的用户或者是在大厅的用户,都可以收到这条提示。
    最后
    1.你说的服务端计时是如何计时的?
    2.创建房间的时候设置一个定时任务我不太明白,如果我要做任务定时的话,我想我会在创建队伍的时候可能会做一个倒计时定时器,假设是10点创建房间,10点10分过期,在创建队伍时之后的10分钟的最后一秒,执行一项任务,然后再向客户端发送消息提示,我不知道我的理解与你的表述是否一致,我自己也在想方法。
    再次感谢walker你多次的帮助,我觉得我也需要自己多想一想,不能遇到问题就不思考,谢谢。

  • walkor 2015-01-05

    看下这个函数\Man\Core\Lib\Task::add以及我给你贴的代码
    这个函数就是添加一个定时任务,执行时间间隔是第一个参数,执行的函数是第二个参数,第三个参数代表是否执行一次还是每隔第一个参数设定的时间不停的定时执行

    假设是10点创建房间,10点10分过期,在创建队伍时之后的10分钟的最后一秒,执行一项任务

    // 10分钟(1060秒)后执行
    \Man\Core\Lib\Task::add(10
    60, function()
    {
    // message 是你的“该队伍已过期”的消息, $client_id_array是发给哪些客户端
    Gateway::sendToAll($message, $client_id_array);
    },
    false // 只执行一次填写false
    );

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