2014-03-02 80 views
0

我正在使用TcpClient有關套接字連接的一個簡單示例。不能配置我的tcpClient,所以我可以再次使用它?

當客戶端連接:

clientSocket.Connect("192.168.1.3", 8888); 
label1.Text = @"connecting..."; 

客戶有一些數據我送到服務器(一個英文單詞),該服務器將處理這些數據,並返回結果(定義這個詞的)!之後,連接必須停止! (當我說Connexion公司必須停止我不知道我需要關閉,我需要配置什麼)

反正停止其中的一個,我應該使用哪一個:

clientSocket.Client.Shutdown(SocketShutdown.Both); 
clientSocket.Client.Dispose(); 
clientSocket.GetStream().Close(); 
clientSocket.Close(); 

我第一個問題是,當我嘗試重新連接到具有相同的客戶端服務器(重用ClientSocket的),它給了我這個例外,並且它標誌着ClientSocket的:

Message=Cannot access a disposed object. 
Object name: 'System.Net.Sockets.TcpClient'. 
Source=System 
ObjectName=System.Net.Sockets.TcpClient 

我秒的問題是:通知客戶服務器需要他停止連接,它發送一個字符串消息:「$」!所以每當客戶收到一條消息時,它會檢查它是否爲「$」,如果是的話!它開始關閉......我確定有一個更好的方法來做到這一點,你可以幫助我,謝謝。

回答

2

Socket.Close()

Close方法關閉與套接字關聯的遠程主機連接,所有管理版本和非託管資源。

這意味着,之前調用.Dispose()自己關閉將導致「無法訪問已釋放的對象」錯誤,因爲.Close()會嘗試出售(閉)已經配置對象。

解決方法很簡單:不要自己撥打.Dispose()並讓.Close()處理它。

+0

對不起,我試了一下,但問題是一樣的!我需要爲您提供更多信息嗎? –

+1

是的,你應該。什麼是'clientSocket.Client'?你關閉的所有這些東西是什麼? –

+0

我的壞,它工作,似乎你所要做的是:clientSocket.Close(); –

1

一般來說,我不會在對象上調用Close之後調用Dispose。 作爲一個API用戶,我只需要致電Dispose,並期望API爲我做正確的事情。

使用(IDisposable)模式是有原因的!使用它時,您不關心任何託管/非託管資源泄漏。

相關問題