描述:
使用gatewayWorker部署ws服務端,businessWorker在發(fā)出數(shù)據(jù)到gateway的時候,先進行 gzip 壓縮,然后再發(fā)送。
問題:
客戶端首次建立連接的時候,出現(xiàn)服務器端發(fā)送的首次數(shù)據(jù),類型為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';
//獲取(客戶端需要的)初始化數(shù)據(jù)
$rateData = self::getExRate();
$json_data = json_encode(['type' => $group_name, 'data' => $rateData]);
//發(fā)送gzip數(shù)據(jù)(此處就是附件圖片出現(xiàn) Text 的情況)
if (!empty($json_data)) {
$gzip_msg = gzencode($data);
Gateway::sendToClient($client_id, $gzip_msg);
}
//訂閱頻道
Gateway::joinGroup($client_id, $group_name);
}
onConnect
是TCP連接建立是執(zhí)行,onWebSocketConnect
是TCP連接建立完畢完成websocket握手后執(zhí)行。
所以Events::onConnect
先執(zhí)行,然后才執(zhí)行onWebSocketConnect
,所以Events::onConnect
里業(yè)務邏輯發(fā)送數(shù)據(jù)的時候gateway一側$connection->websocketType = Workerman\Protocols\Websocket::BINARY_TYPE_ARRAYBUFFER;
可能還沒執(zhí)行到。
gateway.php 里onConnect改成如下試下:
//gateway啟動文件的 二進制傳輸設置
$gateway->onConnect = function($connection)
{
$connection->websocketType = Workerman\Protocols\Websocket::BINARY_TYPE_ARRAYBUFFER;
};