粘包是指傳送端傳送的包速度過快,到接收端那邊多包並成乙個包的現象,比如傳送端連續10次傳送1個字元'a',因為傳送的速度很快,接收端可能一次就收到了10個字元'aaaaaaaaaa',這就是接收端的粘包。
可能我們在平時練習時沒覺的粘包有什麼危害,或者通過把傳送端傳送的速率調慢來解決粘包,但在實時通訊中,傳送端常常是微控制器或者其他系統的資訊採集機,它們的傳送速率是無法控制的,如果不解決接收端的粘包問題,我們無法獲得正常的資訊。
就以我自己正在做的專案來說,接收端是一台單頻指標測量儀,它會把當前測量的單頻指標資訊通過socket介面傳送給伺服器,傳送包長度約100位元組,1s能傳送10個包左右,如果我不實時處理粘包,為前台就無法實時展示採集到的單頻指標資訊。
下面演示的通訊是在之前的框架基礎上增加的一些**,首先先建立乙個包模擬類生成類packagebuilder,它可以自動生成長度不一的包,用於測試傳送,**如下,因為與通訊無關所以對裡面的**不做說明。
publicview codestatic
class
packagebuilder
packagearr[j] =package.tostring();
package.clear();
}return
packagearr;
}
在main函式中測試一下生成的包
解決粘包問題有多種方法,根據傳送包的結構,我採取的是根據包資料長度分包的方法。
如上圖所示,我們傳送包結構為:包頭+資料長度+資料,包頭(head|h1|)是固定長度,內容基本不變,資料長度(兩個位元組)是變化的,資料(data:+隨機字元)也是變化的,其中數字之後的所有內容都是資料,包括'data:'。
前奏講完了下篇文章回到socket。
Socket粘包問題
這兩天看csdn有一些關於socket粘包,socket緩衝區設定的問題,發現自己不是很清楚,所以查資料了解記錄一下 一兩個簡單概念長連線與短連線 1.長連線 client方與server方先建立通訊連線,連線建立後不斷開,然後再進行報文傳送和接收。2.短連線 client方與server每進行一次...
Socket粘包問題
這兩天看csdn有一些關於socket粘包,socket緩衝區設定的問題,發現自己不是很清楚,所以查資料了解記錄一下 一兩個簡單概念長連線與短連線 1.長連線 client方與server方先建立通訊連線,連線建立後不斷開,然後再進行報文傳送和接收。2.短連線 client方與server每進行一次...
socket粘包問題
一兩個簡單概念長連線與短連線 1.長連線 client方與server方先建立通訊連線,連線建立後不斷開,然後再進行報文傳送和接收。2.短連線 client方與server每進行一次報文收發交易時才進行通訊連線,交易完畢後立即斷開連線。此種方式常用於一點對多點 通訊,比如多個client連線乙個se...