解決tcp粘包和半包的問題

此文章爲博主還是小白時,遇到的問題,總結一下:

正常情況下,包都是完整的一個一個的。但是由於一些網絡的問題,可能有些出入(畢竟,網絡有點不可控),大致分爲以下三種:

  1. 一種是正常的字符串輸出。
  2. 一種是多個字符串“粘”在了一起,我們定義這種 ByteBuf 爲粘包。
  3. 一種是一個字符串被“拆”開,形成一個破碎的包,我們定義這種 ByteBuf 爲半包。

 常見的例子就是:正常包體:"我是程序包,我是程序包,我是程序包",粘包的話:"我是程序包我是程序包",半包是:"我是程序包我?(亂碼符號)包"。

解決思路:

問題有點難以避免,就談談解決方式吧。分辨這個包是否完整再處理就變得尤爲重要,那麼我們可以提前說明包的必要屬性。設計大抵是:包頭+包體(+分隔符)。包頭:聲明包的必要屬性,長度,協議id,ip,版本號之類的。包體即是內容。分隔符,用於分割包(因爲可以通過包頭長度,可自己考慮用不用)

解決方法:

在接收信息的時候,建立一個緩衝區,用於分割粘包和半包,將整個包處理,半個包的緩存下來等待湊成整個再處理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章