由於工作要求,需要完成一個TCP伺服器。果斷採用了Netty作為TCP伺服器,完成後覺得選Netty真實非常正確的選擇。
問題發現
在開發的過程中遇到了TCP粘包的問題:由於TCP是一個連續的流,流先進入至緩衝區,然後再從緩衝區被取走,當一個包很大或者連續的資料包總長比緩衝區大的時候,應用無法知道一個資料包的長度是多少,就無法獲取到正確的資料包。
解決辦法
在資料包的前4位規定了資料包的長度。
幸運的是Netty提供了非常簡便的解決方法。
解決拆包的問題
向資料包的前X位填充資料包的長度
Netty原始碼註釋寫的非常清晰,直白明瞭,這裡就不做過多的闡述。
小問題
如果服務端傳送了一條資料包給客戶端,客戶端需要響應(返回一條資料包給服務端),那服務端如何辨認接收到的響應對應是哪一個資料包呢?
HTTP請求又是如何做到一應一答的呢?