当前位置: 首页 > 知识库问答 >
问题:

重新连接TCPClient引发异常

龙兴贤
2023-03-14

System.ObjectDisposedException:无法访问已释放的对象。对象名称:“System.net.Sockets.NetworkStream”。在system.net.sockets.networkstream.read(Byte[]缓冲区,Int32偏移量,Int32大小)

我的问题是我做错了什么?以及重新连接到服务器的最佳解决方案是什么?我的代码如下所示:

  class Test
        {
            private TcpClient myTcpClient;
            private NetworkStream myStream;
            private string host = xxx.xxx.xxx;
            private int port = 8888;
            private string streaming = "";

        public void Listen()
        {
            this.myTcpClient = new TcpClient(host, port);
            this.myStream = this.myTcpClient.GetStream();
            Listener();
        }

        private void Listener()
        {
            try
            {
                while (true)
                {
                    byte[] numResponse = new byte[8192];
                    int x = this.myStream.Read(numResponse, 0, numResponse.Length);
                    Decrypt(numResponse, 0, x);
                    string stream = Encoding.UTF8.GetString(numResponse);
                    this.streaming = string.Concat(this.streaming, stream);
                }
            }
            catch(Excpetion ex)
            {
                // write ex.ToString() to TextFile
                this.myTcpClient = new TcpClient(host, port);
                this.myStream = this.myTcpClient.GetStream();
                Listener();
            }
        }
    }

共有1个答案

潘凯
2023-03-14

我认为您的异常是由于在catch语句中执行re-init而引起的。

在catch中,网络流仍然是打开的。因此,当您创建一个具有相同端口的新TCP客户端时,我猜它使用的是与以前相同的网络流,该流在试图读取时被锁定。

在接球里,你可以试试

 this.myTcpClient.Close();
 this.myTcpClient.Dispose();
 this.myTcpClient = new TcpClient(host, port);
 this.myStream = this.myTcpClient.GetStream();
 类似资料:
  • 我正在尝试在建立Tcp连接后建立Udp连接。所有连接状态和控制都通过Tcp进行,但我希望客户端和服务器也能够通过Udp进行通信。这是我的问题。 服务器将有许多客户端在单独的线程上连接到它。我让它 0 在仅绑定 Tcp 的情况下工作正常,但我想使用 Udp。由于 Udp 打孔,我很难侦听 Udp 上的特定endpoint,因为endpoint在与 NAT 设备通信时可能会发生变化。 因此,简单地提出

  • 问题内容: (下面的示例代码是独立且可运行的,您可以尝试一下,它不会使系统崩溃:) Tom Hawtin在这里评论了这个问题:为什么人们在事件队列上运行JavaGUI 那: EDT不太可能崩溃。 EDT调度中抛出的未经检查的异常将被捕获,转储并且线程继续运行。 有人可以解释一下这是怎么回事(每次您单击 “引发未经检查的异常” 按钮时,都会有意除以零): 我收到以下消息(这是我期望的): 对我来说,

  • 重新建立mqtt连接,前提是必须已经通过Iot_id,Iot_pwd建立过一次mqtt连接。 请求方式: "|4|1|5|\r" 返回值: "|4|1|1|1|\r" mqtt连接状态:连接成功 "|4|1|1|2|reason|\r" mqtt连接状态:连接失败,字符串reason表示失败的原因 Arduino样例: softSerial.print("|4|1|5|\r");

  • 重新连接上一次连接的wifi。 请求方式: "|2|3|\r" 返回值: "|2|1|\r" wifi连接状态:wifi断开连接 "|2|2|\r" wifi连接状态:正在连接wifi "|2|3|ip|\r" wifi连接状态:wifi连接成功,返回OBLOQ的ip地址 "|2|4|\r" wifi连接状态:wifi连接失败,检查SSID和PWD是否输入正确 Arduino样例: softSer

  • 我已经按照这里的示例中所述配置了TcpClient。我试图使以下代码在服务器意外关闭连接的情况下具有弹性: 在这种情况下,我希望方法“getConnectionFromPool”能够从池中检索连接,或者如果没有可用的连接,则打开一个新连接。 注意到后。connect()最终服从于ConnectionProvider。acquire(),我尝试使用tcpClient。connect(),但有必要更改

  • 我一直得到以下警告在我的SpringRabbitmq消费者方面。它一直在寻找重新启动。 和