swoole websocket 客户端是否支持数据gzip解压?

Andy
  • 4
新手上路,请多包涵

问题描述

Version 4.3.1
websocket服务端返回的所有数据都进行了 GZIP 压缩,需要 client 在收到数据之后需要进行解压

相关代码

go(function () {
    $cli = new Co\http\Client("api.huobi.pro", 443, true);//需要上vpn
    $ret = $cli->upgrade("/ws");
    var_dump($cli->statusCode);
    if ($ret) {
        while (true) {
            var_dump($cli->push('{"sub": "market.btcusdt.kline.1min"}'));
            var_dump($cli->recv());
            co::sleep(1);
        }
    }
});

你期待的结果是什么?实际看到的错误信息又是什么?

运行结果和我的理解
int(101) #连接成功
bool(true) #发送数据成功
bool(false) #$cli->recv()失败,怀疑是不是返回的是gzip数据,导致的失败
接着连接断开,握手失败错误信息
A PHP Error was encountered

Severity: Warning
Message: SwooleCoroutineHttpClient::push(): websocket handshake failed, cannot push data.

回复
阅读 1.3k
3 个回答
Andy
  • 4
新手上路,请多包涵
✓ 已被采纳
奔赴
  • 3
新手上路,请多包涵
Frank.Luo
  • 1
新手上路,请多包涵
<?php
use Swoole\Coroutine;
use Swoole\Coroutine\Http\Client;
use function Swoole\Coroutine\run;

run(function () {
    $client = new Client('api.huobi.pro',443,true);
    $ret = $client->upgrade('/ws');
    var_dump($ret);
    if ($ret) {
        while(true) {
            $arr = [
                'sub'   => "market.btcusdt.kline.1min",
                'id'    => "id1"
            ];
            $client->push(json_encode($arr));
            
            //data是因为采用了gzip压缩,解压一下就OK了
            $msg = gzdecode($client->recv()->data);
            var_dump($msg);

            Coroutine::sleep(0.1);
        }
    }
});

image.png

你知道吗?

宣传栏