此文章爲博主還是小白時,遇到的問題,總結一下:
正常情況下,包都是完整的一個一個的。但是由於一些網絡的問題,可能有些出入(畢竟,網絡有點不可控),大致分爲以下三種:
- 一種是正常的字符串輸出。
- 一種是多個字符串“粘”在了一起,我們定義這種 ByteBuf 爲粘包。
- 一種是一個字符串被“拆”開,形成一個破碎的包,我們定義這種 ByteBuf 爲半包。
常見的例子就是:正常包體:"我是程序包,我是程序包,我是程序包",粘包的話:"我是程序包我是程序包",半包是:"我是程序包我?(亂碼符號)包"。
解決思路:
問題有點難以避免,就談談解決方式吧。分辨這個包是否完整再處理就變得尤爲重要,那麼我們可以提前說明包的必要屬性。設計大抵是:包頭+包體(+分隔符)。包頭:聲明包的必要屬性,長度,協議id,ip,版本號之類的。包體即是內容。分隔符,用於分割包(因爲可以通過包頭長度,可自己考慮用不用)
解決方法:
在接收信息的時候,建立一個緩衝區,用於分割粘包和半包,將整個包處理,半個包的緩存下來等待湊成整個再處理。