描述:
使用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);
}
onConnect
是TCP连接建立是执行,onWebSocketConnect
是TCP连接建立完毕完成websocket握手后执行。所以
Events::onConnect
先执行,然后才执行onWebSocketConnect
,所以Events::onConnect
里业务逻辑发送数据的时候gateway一侧$connection->websocketType = Workerman\Protocols\Websocket::BINARY_TYPE_ARRAYBUFFER;
可能还没执行到。gateway.php 里onConnect改成如下试下:
感谢,目前按照这个设置,测试都没有出现问题了。