swoole使用tcp的時候粘包問題


文章參考地址http://www.maxincai.com/post/swoole-study-notes/#使用自定義協議粘包

如何解決swoole中使用tcp的粘包問題

兩種方式:
第一種通過在swoole_server的set中設置分隔符
(1)在你的client端,調用send時加
$name = "xiaomi";
$client->send($name.PHP_EOL);


(2)
在server端
$server->set(
array(
'open_eof_check'=>true, //是否檢測結尾
'package_eof'=>PHP_EOL, //結尾標識,這里的結尾最好使用不容易跟真正的body混淆的字符
'open_eof_split'=>true //必須開啟切割
)
);


還需要在你的onReceive 或者onTask中對接收到的數據做處理

public function onTask($server,$task_id,$from_id,$domain_name)
{
echo "當前處理的task_id:{$task_id},來自:{$from_id},數據{$domain_name}".PHP_EOL;
$domain_name = rtrim($domain_name,PHP_EOL);
}




第二種方式:采用固定包頭+包體設置。
(1)在客戶端:
// 包體
$body = str_repeat("A", 8000);


// 包頭 需要用pack函數轉換為網絡字節序
$head = pack('N', strlen($body));
$client->send($head.$body);
(2)在服務端
$server->set([
'open_length_check' => true,
    'package_length_type' => "N", // 4個字節
    'package_length_offset' => 0,
    'package_body_start' => 4, // 表示只計算包體的長度,不包含長頭的長度
    'package_max_length' => 80000,
]);
open_length_check 開啟長度檢測
package_length_type 包頭里面必須有一個長度,一般為N或n, N為網絡字節序的整型,占4個字節。
n為2個字節
package_length_offset 偏移量
package_body_start 從什么位置開始計算包體長度
我在實際的過程中,碰到的問題是無法讓頭部長度固定。因此在測試中出現了種種問題。如果有解決的,請告知258317757




注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



關於TCP的粘包問題 tcp的粘包問題 TCP的粘包問題 TCP的粘包問題 TCP的粘包問題 TCp傳輸粘包問題 解決tcp粘包問題 QT tcp粘包問題 TCP粘包的問題大家是怎么處理的 基於TCP傳輸的粘包問題
 
粤ICP备14056181号  © 2014-2021 ITdaan.com