TCP 是個“流”協定,所謂流,就是沒有界限的一串資料。大家可以想想河裡的流水, 是連成一片的,其間并沒有分界線。
假設 Socket 通道中有兩個完整的資料包 D1、D2
什麼是粘包
第一次讀取到了 D1、D2 完整資料包,D1 跟 D2 就粘一起了,确當成是一個資料包處理。

什麼是拆包
第一次讀取到了完整的 D1 包和 D2 包的部分内容,第二次讀取到了 D2 包的剩餘内容,導緻 D2 資料包不完整。
解決方案
1:封包限定長度
設定(發送/響應)封包長度,如果(發送/響應)封包長度不夠,空位補空格。
優點: 簡單,快捷,友善。
缺點: 長度設定大了,浪費記憶體。設定小了,又怕不夠。
2:設定分隔符
在封包結尾設定分隔符,比如 \r\n 或者一些特殊的字元。
優點: 簡單,快捷,友善。
缺點:在讀取封包的時候,不會是 1 個 1 個位元組去讀取,是以需要自己檢索特殊分隔 符位置。而且有可能會讀取到下一個封包内容,是以也需要将讀取到的封包進行緩存。
例如:第一次讀取:[1,2,3,4,\r,\n,7,8,9],
第二次讀取:[10,11,12,\r,\n,13,14,15]
[1,2,3,4]是一個完整的封包,[7,8,9,10,11,12]是一個完整封包。
3:将封包分成【消息頭,消息體】
設定固定的消息頭長度,消息頭中描述消息體的長度。
例如:
在讀取封包的時候,先将固定長度的消息頭讀取,擷取的消息體長度,再讀取 出消息體封包。
優點: 有效解決粘包/拆包問題。