Unity+.NET3.5+Android的TcpClient的一個BUG

如果你遇到了以下描述的情況,很可能是這個Bug導致的:

  1. 客戶端在斷開上一個連接以後,開啓下一個連接,新連接讀取到的數據發生錯誤
  2. 條件同上,Stream一直處在read阻塞中,所需要的數據讀取不全
  3. 條件同上,網絡通信奇奇怪怪

問題的具體原因經過兩天的禿頂式測試,現總結如下:

  1. 使用TcpClient進行Socket連接以後,通過Read方法進行數據的讀取,Read方法屬於同步操作,當緩衝區沒有數據可讀時,會阻塞所在線程。當斷開TcpClient的連接時,如果處在Read方法的阻塞中,則拋出IOException。這是一個正常的流程。
  2. 斷開連接時,可以通過關閉NetworkStream或者關閉TcpClient完成,當然你也可以都釋放一遍(其實都一樣)
  3. 以上內容來自MSDN,可以自己去一點點看
  4. 在Unity編輯器中運行,確實如上述過程一樣,Read會被關閉,並拋出IOException。
  5. 但是,在Android端,沒有拋異常!所以Read仍然在阻塞中!
  6. 並且,最神奇的是,這個已經被關閉的NetworkStream的Read方法我們就把他叫做BadRead,這個BadRead,居然讀取到了新的連接的NetworkStream中的數據!於是,新的NetworkStream因爲被BadRead讀取了部分內容,導致position後移,那個正牌的Read方法在讀取時,就漏掉了被偷偷讀掉的內容!

解決思路枯燥而乏味:切換.NET到4.6

其實我也試圖通過手動釋放資源,把能想到的佔用的資源,能調用的Close和Dispose都調了個遍,然而並沒有什麼卵用。

以上情況僅供參考,畢竟在自己公司裏的同事都不信,理由是,使用同樣框架的項目已經運營了半年了...

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