swoole使用tcp的時候粘包問題

2021-08-03 23:18:28 字數 1287 閱讀 9137

文章參考位址使用自定義協議粘包

如何解決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)

,來自:,資料".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

swoole 對tcp粘包處理

1,在短時間內資料傳送過快時,會發生粘包現象,比如下面的 這個現象是雙向的,客戶端,服務端均可能出現此問題 下面只是以客戶端 to 服務端舉例 server.php host 0.0.0.0 建立server物件,監聽 127.0.0.1 9501埠 serv new swoole server h...

TCP的粘包現象

1 什麼是粘包現象 tcp粘包是指傳送方傳送的若干包資料到接收方接收時粘成一包,從接收緩衝區看,後一包資料的頭緊接著前一包資料的尾。2 為什麼出現粘包現象 1 傳送方原因 我們知道,tcp缺省會使用nagle演算法。而nagle演算法主要做兩件事 1 只有上乙個分組得到確認,才會傳送下乙個分組 2 ...

TCP的粘包現象

原文 看面經時,看到有面試官問tcp的粘包問題。想起來研一做購物車處理資料更新時遇到粘包問題,就總結一下吧。1 什麼是粘包現象 tcp粘包是指傳送方傳送的若干包資料到接收方接收時粘成一包,從接收緩衝區看,後一包資料的頭緊接著前一包資料的尾。2 為什麼出現粘包現象 1 傳送方原因 所以,正是nagle...