无法处理我的tcpClient所以我可以重新使用它?

时间:2014-03-02 18:59:49

标签: c# sockets tcpclient

我正在使用TcpClient这是一个简单的套接字连接示例。

客户端连接时

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

客户端必须向服务器发送一些数据(英文单词),然后服务器将处理该数据,并返回结果(该单词的定义)!之后必须停止连接! (当我说连接需要停止时我不知道我需要关闭什么以及我需要处理什么)

无论如何要阻止我应该使用哪一个:

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 个答案:

答案 0 :(得分:2)

来自Socket.Close()

  

Close方法关闭远程主机连接,并释放与Socket关联的所有托管和非托管资源。

这意味着在关闭之前自己调用.Dispose()将导致“无法访问已处置对象”错误,因为.Close()将尝试处置(并关闭)已经处置的对象。

解决方案很简单:不要自己致电.Dispose()并让.Close()处理它。

答案 1 :(得分:1)

一般情况下,在“对某个对象调用Dispose之后,我永远不会调用Close”。 作为API用户,我只需要调用Dispose并期望API为我做正确的事情。

使用(IDisposable)模式是有原因的!使用它时,您不关心任何托管/非托管资源泄漏。