天天看點

Socket程式設計 (異步通訊,解決Tcp粘包) - Part3

Socket程式設計 (異步通訊,解決Tcp粘包)

  從上一章的通訊中,我們發現如果使用Tcp連續發送消息會出現消息一起發送過來的情況,這樣給我們程式設計造成一定的問題,給我們的資訊解析造成一定的問題。那麼這篇文章就将針對以上問題給出解決方案......

問題一般會出現的情況如下,假設我們連續發送兩條兩天記錄("我是liger_zql"):

模拟發送示例:

Socket程式設計 (異步通訊,解決Tcp粘包) - Part3
Socket程式設計 (異步通訊,解決Tcp粘包) - Part3

接收端接受兩條資訊會出現如下三種情況:

  1.(1)我是liger_zql(2)我是liger_zql

  2.(1)我是liger_zql我是(2)liger_zql

  3.(1)我是liger_zql我是liger_zql

通過以上三種情況,顯然2、3都不是我們想要的結果。那麼如何處理這中情況呢?

解決方案:通過自定義協定...

我們可以以将資訊以xml的格式發送出去,列入<protocol>content</protocol>通過正則比對資訊是否完整,如果不完整,我們可以先将本次接受資訊緩存接受下一次資訊,再次比對得到相應的結果。

将資訊對象轉換成一定格式的xml字元串:

Socket程式設計 (異步通訊,解決Tcp粘包) - Part3
Socket程式設計 (異步通訊,解決Tcp粘包) - Part3

對接收的資訊通過正則進行比對處理:

Socket程式設計 (異步通訊,解決Tcp粘包) - Part3
Socket程式設計 (異步通訊,解決Tcp粘包) - Part3

然後将該定義的協定換換成資訊對象,通過對象擷取自己想要的資訊。

Socket程式設計 (異步通訊,解決Tcp粘包) - Part3
Socket程式設計 (異步通訊,解決Tcp粘包) - Part3

最後運作結果如下:

Socket程式設計 (異步通訊,解決Tcp粘包) - Part3

好了Tcp粘包的問題我們解決了。下一章我們将解決Udp丢包的個人解決方案!