簡體   English   中英

C#中TCP套接字中的System.ObjectDisposedException

[英]System.ObjectDisposedException in TCP sockets in C#

這是我的服務器:

class Server
    {
        static void Main(string[] args)
        {
            TcpListener listener = new TcpListener(IPAddress.Any, 5004);
            listener.Start();
            TcpClient client;
            while (true)
            {
                client = listener.AcceptTcpClient();
                if (client.Connected)
                {
                    Console.WriteLine("client connected");
                    break;
                }

            }


            NetworkStream sr = client.GetStream();
            while (true)
            {
                byte[] message = new byte[1024];
                sr.Read(message, 0, message.Length);
                sr.Close();
                Console.WriteLine(message.ToString());
            }

        }
    }

這是我的客戶:

class Program
    {

        static void Main(string[] args)
        {
            TcpClient client = new TcpClient();
            Console.WriteLine("Insert server address");
            string server = Console.ReadLine();
            if (server == "")
            {
                server = "192.168.1.2";
            }
            client.Connect(IPAddress.Parse(server), 5004);

            NetworkStream sw = client.GetStream();
            while (true)
            {
                byte[] message = Encoding.ASCII.GetBytes(Console.ReadLine());
                sw.Write(message, 0, message.Length);
                sw.Close();
            }

        }

    }

當我運行服務器和客戶端時,一切正常,並且出現“客戶端已連接”消息。 問題是,當我嘗試從客戶端向服務器發送消息時,在sr.Read(message, 0, message.Length);中的服務器上引發了System.ObjectDisposedException sr.Read(message, 0, message.Length); 線。 知道如何解決該問題或原因是什么?

您正在同時在客戶端和服務器的while循環中關閉流。 Close移到循環外部,或者更好的是,利用Close調用Dispose的事實,它允許您使用IDisposable接口功能,例如, using

using (NetworkStream sw = client.GetStream())
{
     while (true)
     {
         byte[] message = Encoding.ASCII.GetBytes(Console.ReadLine());
         sw.Write(message, 0, message.Length);
         // Todo : Implement some kind of termination to the loop
     }
     sw.Flush();
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM