AsyncSocket長連線棒包裝問題解決

2021-09-08 11:11:20 字數 1733 閱讀 5104

project正在使用長連線快來server溝通。因此,指定我們的協議前兩個位元組為資料長度來區分資料報

1.server傳輸資料過快,出現粘包的問題,比如

1.1服務端一次發來多個推送訊息;

1.2網路不穩定,client連續傳送多個請求client一次接收到所有答覆。

2.client的乙個請求報文,服務端的應答報文資料過大。到ip層須要進行分片,因此client這邊就會出現幾次才接收到完整的資料的情況;

首先有下面4個方法須要介紹

/**

**例項方法

**呼叫此方法以後,當套接字接收緩衝區有可用位元組的時候。會觸發onsocket:didreaddata:withtag:託付方法。此時接收到的資料會出現上面說到的問題*/

- (void)readdatawithtimeout:(nstimeinterval)timeout tag:(long)tag;

/****例項方法

**呼叫此方法以後。當套接字接收緩衝區有length長度的可用位元組的時候,會觸發onsocket:didreaddata:withtag:託付方法,此時接收到固定長度的資料,這個固定長度就是length給出的值,當length的長度大於接收緩衝區資料的長度的時候,就會等待,直到接收到length長度的資料的時候才會觸發以上託付方法的呼叫*/

- (void)readdatatolength:(nsuinteger)length withtimeout:(nstimeinterval)timeout tag:(long)tag;

/**

**例項方法

**此方法功能同上,僅僅是多了幾個引數

,buffer是你將接收的資料寫到的地方,offset是寫到buffer中的偏移位置

*/

- (void)readdatatolength:(nsuinteger)length

withtimeout:(nstimeinterval)timeout

buffer:(nsmutabledata *)buffer

bufferoffset:(nsuinteger)offset

tag:(long)tag;

/**

**託付方法

**此方法上面已經說到*/

- (void)onsocket:(asyncsocket *)sock didreaddata:(nsdata *)_data withtag:(long)tag。

解決方法:

client每次傳送請求以後。首先僅僅接收兩個位元組的長度位元組,例如以下:

[sendsocket readdatatolength:2 withtimeout:set.timeout tag:tag];

[sendsocket writedata:data withtimeout:set.timeout tag:tag];

然後當有可用位元組到達套接字接收緩衝區的時候觸發下面託付方法,我們在裡面做例如以下處理,這樣既攻克了粘包的問題,也攻克了資料過大。多次接收完整的問題;

- (void)onsocket:(asyncsocket *)sock didreaddata:(nsdata *)_data withtag:(long)tag

[self parserdata:responddata withtag:tag];

}

leetcode 連線棒材的最低費用

題目描述 為了裝修新房,你需要加工一些長度為正整數的棒材 sticks。如果要將長度分別為 x 和 y 的兩根棒材連線在一起,你需要支付 x y 的費用。由於施工需要,你必須將所有棒材連線成一根。返回你把所有棒材 sticks 連成一根所需要的最低費用。注意你可以任意選擇棒材連線的順序。反思 注意點...

HTTP長連線和WebSocket長連線的區別

要理解http長連線和websocket長連線的區別,首先要理解一下什麼是http的長連線和短連線。首先需要消除乙個誤解 http協議是基於請求 響應模式的,因此客戶端請求後只要服務端給了響應,本次http請求就結束了,沒有長連線這一說。那麼自然也就沒有短連線這一說了。所謂的http分為長連線和短連...

長連線 短連線

長連線在web中的運用 如果沒有客戶端大量的訪問,可以採用html5的serversocket長連線 例如hudson 執行時會實時的返回當前執行的結果 vmstat 監控 b 長連線 資料庫連線 短連線 http連線 b b 一 長連線與短連線 b 長連線 client方與server方先建立連線...