群发消息客户端能收到消息,但是websocket连接成功时无法接收到client_id

gongjianjun

问题描述

项目和gatewayworker服务是独立部署的,在同一个服务器上,GatewayWorker不接受客户端发来的数据,即GatewayWorker不处理任何业务逻辑,GatewayWorker仅仅当做一个单向的推送通道。
仅当项目需要向浏览器主动推送数据时才在项目中调用Gateway的API GatewayClient完成推送。
问题:
客户端websocket连接成功了,服务端执行接口Gateway::sendToAll,客户端也能接收到消息,但是连接成功时,接收不到client_id,日志里Events.php中的onConnect方法没有执行

程序代码

<script type="text/javascript">
/**
 * 与GatewayWorker建立websocket连接,域名和端口改为你实际的域名端口,
 * 其中端口为Gateway端口,即start_gateway.php指定的端口。
 * start_gateway.php 中需要指定websocket协议,像这样
 * $gateway = new Gateway(websocket://0.0.0.0:7272);
 */
ws = new WebSocket("wss://websocket.baoxiaoban.com/wss");
 ws.onopen = function(event) {
     alert("连接成功");
    };

// 服务端主动推送消息时会触发这里的onmessage
ws.onmessage = function(e){
    alert(e.data);
    var data = JSON.parse(e.data);
    var type = data.type || '';
    switch(type){
        case 'init':
            // 存储client_id
            alert(data.client_id);
            clientId = data.client_id;
            // 可以在这里将client_id发送到服务器进行绑定或其他操作
            break;
        case 'message':
            alert(data.text);
        // 其他消息处理
    }
};
</script>

Events.php代码:
class Events
{
    /**
     * 当客户端连接时触发
     * 如果业务不需此回调可以删除onConnect
     * 
     * @param int $client_id 连接id
     */
    public static function onConnect($client_id)
    {
        Gateway::sendToClient($client_id, json_encode(array(
            'type'      => 'init',
            'client_id' => $client_id
        )));
    }

   /**
    * 当客户端发来消息时触发
    * @param int $client_id 连接id
    * @param mixed $message 具体消息
    */
   public static function onMessage($client_id, $message)
   {
        // 向所有人发送 
        //Gateway::sendToAll("nihao");
   }

操作系统及workerman/webman等框架组件具体版本

Ubuntu 22.0,gatewayworker最新版本

74 0 0
0个回答

×
🔝