問題1、粘包問題
解決方法一:tcp提供了強制資料立即傳送的操作指令push,tcp軟體收到該操作指令後,就立即將本段資料傳送出去,而不必等待傳送緩衝區滿;
解決方法二:傳送固定長度的訊息
解決方法三:把訊息的尺寸與訊息一塊傳送
解決方法四:雙方約定每次傳送的大小
解決方法五:雙方約定使用特殊標記來區分訊息間隔
解決方法六:標準協議按協議規則處理,如sip協議
tcp粘包和拆包問題
(經典)tcp粘包分析
socket/tcp粘包、多包和少包, 斷包
netty精粹之tcp粘包拆包問題
問題2、字串編碼問題
將中文字串用utf8編碼格式轉換為位元組陣列傳送時,乙個中文字元可能會占用2~4個位元組(假設為3個位元組),這3個位元組可能分3次接收,接收端每次接收完後用utf8編碼格式轉換為字串,就會出現亂碼,並導致接收長度計算錯誤的情況。
解決方法一:以位元組數做為訊息長度的計算單位,而不是字元個數。
解決方法二:傳送方和接收方都採用unicode編碼格式。
問題3、長連線的保活問題
標準tcp層協議裡把對方超時設為2小時,若伺服器端超過了2小時還沒收到客戶的資訊,它就傳送探測報文段,若傳送了10個探測報文段(每乙個相隔75s)還沒有收到響應,就假定客戶出了故障,並終止這個連線。因此應對tcp長連線進行保活。
以下是非同步通訊時會遇到的問題:
問題4、緩衝區髒資料問題
同步傳送的拷貝,是直接拷貝資料到基礎系統緩衝區,拷貝完成後返回;
非同步傳送訊息的拷貝,是將socket自帶的buffer空間內的所有資料,拷貝到基礎系統傳送緩衝區,並立即返回;
因此非同步傳送時緩衝區設定不好會導致接收到髒資料的問題,如下所示:
第一次傳送資料:1234567890
第一次接受資料:1234567890
第二次傳送資料:abc
第二次接受資料:abc4567890
請參考:
解決方法一:將緩衝區的大小設定為實際傳送資料的大小。
問題5、記憶體碎片問題
頻繁的申請緩衝區會導致記憶體碎片的問題。
解決方法一:使用物件池和記憶體池。
請參考msdn:
問題6、亂序問題
多個執行緒使用非同步通訊方式向同乙個接收端(socket)同時傳送資料,會導致接收端接收的資料混亂。如下所示:
執行緒1第一次傳送:123456789,假設未傳送完,只傳送了123
執行緒2第一次傳送:abcdefgh,假設未傳送完,只傳送了abc
執行緒1第二次傳送:456789,傳送完成
執行緒2第二次傳送:defgh,傳送完成
接收端最終接收的資料為:123abc456789defgh。
解決方法一:乙個連線的傳送端線程排隊傳送資料。
SAP常見問題及解決方法
tp check all pf tp clearold all pf 45.saprouter相關 niping s server端 niping c h target host client端 saprouter r start saprouter 直接輸入niping and saprouter...
Ubuntu常見問題及解決方法
解決方法 不錯的方案 在使用者目錄下新建.vimrc,儲存即可生效。若想對所有使用者生效,可直接修改 etc vimrc.set nocompatible 關閉 vi 相容模式 syntax on 自動語法高亮 colorscheme molokai 設定配色方案 set number 顯示行號 s...
jmeter 常見問題 及解決方法
jmeter常見問題 一 結束時間的排程程式執行緒組是在過去,修復的結束時間欄位的值。解決方法 二 檢視結果樹中,響應資料為亂碼 問題分析 當響應資料或響應頁面沒有設定編碼時,jmeter會按照jmeter.properties檔案中,sampleresult.default.encoding設定的...