gatewayworker 二进制ws首次建立连接发文异常

jackyxie

描述:
使用gatewayWorker部署ws服务端,businessWorker在发出数据到gateway的时候,先进行 gzip 压缩,然后再发送。

问题:
客户端首次建立连接的时候,出现服务器端发送的首次数据,类型为Text,而不是Binary类型。
(附件中红色方框 内容为 Text的,属于异常的情况)

相关gateway代码、Events代码

//gateway启动文件的 二进制传输设置
$gateway->onConnect = function($connection)
{
    $connection->onWebSocketConnect = function($connection , $http_header)
    {
        $connection->websocketType = Workerman\Protocols\Websocket::BINARY_TYPE_ARRAYBUFFER;
    };
};

//Events模块 简要相关的地方

class Events
{
    public static function onWorkerStart($businessWorker)
    {
        //process_timeout
        $businessWorker->processTimeoutHandler = function ($trace_str, $exception) use ($businessWorker) {
            \Workerman\Worker::log($trace_str);
            return true;
        };
    }

    public static function onConnect($client_id)
    {
        $group_name = 'rate_group';
        //获取(客户端需要的)初始化数据
        $rateData = self::getExRate();
        $json_data = json_encode(['type' => $group_name, 'data' => $rateData]);

        //发送gzip数据(此处就是附件图片出现 Text 的情况)
        if (!empty($json_data)) {
            $gzip_msg = gzencode($data);
            Gateway::sendToClient($client_id, $gzip_msg);
        }

        //订阅频道
        Gateway::joinGroup($client_id, $group_name);
}
阅读 1487
1个回答

walkor

onConnect是TCP连接建立是执行,onWebSocketConnect是TCP连接建立完毕完成websocket握手后执行。
所以Events::onConnect先执行,然后才执行onWebSocketConnect,所以Events::onConnect里业务逻辑发送数据的时候gateway一侧$connection->websocketType = Workerman\Protocols\Websocket::BINARY_TYPE_ARRAYBUFFER; 可能还没执行到。

gateway.php 里onConnect改成如下试下:

//gateway启动文件的 二进制传输设置
$gateway->onConnect = function($connection)
{
    $connection->websocketType = Workerman\Protocols\Websocket::BINARY_TYPE_ARRAYBUFFER;
};
  • jackyxie 2019-11-13

    感谢,目前按照这个设置,测试都没有出现问题了。