【问题标题】:Can't Dispose my tcpClient so i can reuse it again?无法处理我的 tcpClient 以便我可以再次重用它?
【发布时间】:2014-03-02 18:59:49
【问题描述】:

我正在使用 TcpClient 一个简单的 Socket 连接示例。

当客户端连接时:

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

我的第二个问题是:通知客户端服务器要他停止连接,它发送一个字符串消息:“$”!所以每次客户端收到一条消息时,它都会检查它是否是“$”,如果是!它开始关闭...我确定有更好的方法可以做到这一点,您能帮帮我吗,谢谢。

【问题讨论】:

    标签: c# sockets tcpclient


    【解决方案1】:

    来自Socket.Close()

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

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

    解决方法很简单:不要自己打电话给.Dispose(),让.Close()处理。

    【讨论】:

    • 对不起,我试过了,但问题是一样的!我需要为您提供更多信息吗?
    • 是的,你应该这样做。 clientSocket.Client 是什么?你要关闭的所有这些东西是什么?
    • 我的错,它正在工作,看来你所要做的就是:clientSocket.Close();
    • 但是我的 sec 问题呢,有没有办法通过发送信号或从服务器远程关闭 TcpClient ?
    • 我只是在这里大声思考,但在我看来,您应该能够使用while(clientSocket.Connected)。一旦在另一端关闭连接,它将自动停止。
    【解决方案2】:

    一般来说,我永远不会在对象上调用Close“之后”调用Dispose。 作为 API 用户,我只会调用 Dispose 并期望 API 为我做正确的事情。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-25
      • 2020-02-19
      • 1970-01-01
      • 1970-01-01
      • 2021-11-28
      • 2023-02-06
      • 1970-01-01
      相关资源
      最近更新 更多