onMessage中sendToGroup消息重复的问题

Dobeen

Events.php 中:

    public static function onMessage($client_id, $message)
    {
        $message = json_decode($message, true);
        Gateway::sendToGroup($message['group_id'], json_encode([
            'type' => 'test',
            'group' => Gateway::getClientSessionsByGroup($message['group_id'])
        ]));
    }

客户端进入后主动向服务端发送一次消息:

ws.send('{"type":"ready", "group_id": "{{ $race->id }}"}');

然后客户端的监听:

ws.onmessage = function(e){
    var data = eval("("+e.data+")");
    var type = data.type || '';
    console.log(data);
}

问题症状:

第一个用户进入,发送ready,服务端响应信息,客户端监听,收到服务端响应的 1 条消息;
第二个用户进入,发送ready,服务端响应信息,客户端监听,收到服务端响应的 2 条消息;
第三个用户进入,发送ready,服务端响应信息,客户端监听,收到服务端响应的 3 条消息;
...
第N个用户进入,发送ready,服务端响应信息,客户端监听,收到服务端响应的 N 条消息;

正常需求:

不管几个客户端加入group,服务端sendToGroup后,每个客户端只收一次服务端消息。

不知道哪里出问题了,请大神指点。

250 2 0
2个回答

walkor

看下是不是一个页面建立了多个websocket连接

  • Dobeen 2022-01-16

    ws = new WebSocket("ws://race.test:2346");
    ws.onmessage = function(e){
    ......
    }

    确认只建立了一条连接

  • walkor 2022-01-16

    截图下完整的测试过程吧

Dobeen

截图的是客户端一,是当第二个客户端加入后,服务端通知joined,然后客户端二向服务端发送一条消息后,客户端一的截图。

  • walkor 2022-01-16

    感觉你的业务代码没发完整,发下完整的服务端代码和客户端代码。

  • six 2022-01-17

    截图的是客户端一,是当第二个客户端加入后,服务端通知joined,然后客户端二向服务端发送一条消息后

    他这个应该是服务端通知joined这步通知给了所有的客户端,然后所有的客户端向服务端发送了一条消息,然后单个客户端就收到N条消息了。所以他的业务逻辑可能有问题。

🔝