TCP粘包,半包解決方法

 粘包,半包是TCP通信中經常遇到的問題,一般遊戲開發中,每條消息都包含消息頭,消息類型,以及要處理的數據信息,一般消息頭上包含着此條消息內容的長度,一旦socket中讀出的內容長度大於消息頭長度,我們稱之爲粘包,反之則稱之爲半包。遊戲開發中,一般每個socket中伴隨着自定義緩存區,用於存儲上一次未處理完的未完整信息。我之前開發的遊戲用的是java nio方式通信,java.nio.channels.SelectionKey中提供一個方法attach(Object object),新建一個緩存區ByteBuffer,調用attach將緩存區附加到此鍵,每次行鍵集掃描後,從SocketChannel中讀取數據,然後再檢查此鍵上一次緩存區是否有未完整的數據,將上一次未處理完成的數據和新讀取的數據拼起來,再進行數據處理,直到所有消息處理完畢,或到半包處,把未處理完成的消息再次放進緩存區,以此類推。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章