在進行Socket長鏈接時,若服務器或客戶端出現異常時,另一端對Socket對話進行操做時,程序會出現沒法訪問已釋放的對象的問題。例如客戶端出現問題主動斷開Socket時,當服務器操做Socket時,好比主動斷開Socket會話,那麼程序會出現「沒法方位已釋放的對象」,是因爲客戶端的緣由致使服務器和客戶端的Socket已經不存在或鏈接已經斷開,即Socket已經釋放,服務器再操做服務器和客戶端的Socket確定會報錯,所以在服務器或客戶端一側操做Socket時,必須首先判斷Socket是否存在、鏈接是否正常,只有存在且鏈接正常的Socket才容許操做。以服務器斷開Socket爲例:html
//判斷Socket是否存在且鏈接正常,存在且鏈接正常的Socket才運行進行斷開操做 if (_cliSock != null && _cliSock.Connected) { //關閉Socket以前,首選須要把雙方的Socket Shutdown掉 _cliSock.Shutdown(SocketShutdown.Both); //Shutdown掉Socket後主線程中止10ms,保證Socket的Shutdown完成 System.Threading.Thread.Sleep(10); //關閉客戶端Socket,清理資源 _cliSock.Close(); }
注:Socket對話就至關於兩個國家(A和C)經過貿易渠道進行稀土交易,正常狀況下,A、C國家正常支持該貿易,貿易能夠正常進行,若C國家法律禁止稀土出口,主動關閉了該貿易通道,可是A國家並不知道,那麼A國家發往C國的全部貿易請求將會被丟失,對貿易通道全部的維護都將失敗,因此須要在C國執行法律時(即Close())以前,須要關閉雙方的貿易通道(即 SocketShutdown.Both),而後等待最後一批在貿易通道的貨物成功運送至A國(即主線層休眠10ms),再執行法律,真正關閉Socket鏈接。服務器
來源:http://blog.sina.com.cn/s/blog_5f4ffa17010112h7.htmlspa