Эти темы делятся данными?

Здравствуйте, я в настоящее время смущен ошибкой, которую я получаю. Ошибка

Произошло необработанное исключение типа "System.IO.IOException" в System.dll

Дополнительная информация: Невозможно записать данные в транспортное соединение: существующее соединение было принудительно закрыто удаленным хостом.

И вызвано этой строкой кода

this.StreamWriter.WriteLine("Number of items can not be 0 or less");

Однако эта ошибка возникает только в 50% случаев. Поскольку мой проект включает многопоточность, я думаю, что мои потоки каким-то образом совместно используют streamWriter и закрывают его, прежде чем другие потоки смогут его использовать. В отличие от каждого потока, создающего свой собственный, как я пытался сделать. Вот некоторый соответствующий код:

private static void Main(string[] args)
    {
         TcpListener server = null;
        Thread thread1 = null;
        Thread thread2 = null;
        Thread thread3 = null;
    try
    {
        // Set the TcpListener on port 12000.
        Int32 port = 12000;
        IPAddress localAddr = IPAddress.Parse("127.0.0.1");

        // TcpListener server = new TcpListener(port);
        server = new TcpListener(localAddr, port);

        // Start listening for client requests.
        server.Start();


        // Enter the listening loop.
        Console.Write("Waiting for a connection... ");
        bool full = false;
        while (true)
        {
           //the code seen blow is to insure that only 3 threads are running at once.
            if (!full)
            {          

                if (thread1 == null)
                {
                    TcpClient client = server.AcceptTcpClient();
                    HandleClient handleObj = new HandleClient(client, myInventory);
                    thread1 = new Thread(handleObj.HandleNewClient);
                    thread1.Start();
                }
                else if (!thread1.IsAlive)
                {
                    TcpClient client = server.AcceptTcpClient();
                    HandleClient handleObj = new HandleClient(client, myInventory);
                    thread1 = new Thread(handleObj.HandleNewClient);
                    thread1.Start();
                }
                if (thread2 == null)
                {
                    TcpClient client = server.AcceptTcpClient();
                    HandleClient handleObj = new HandleClient(client, myInventory);
                    thread2 = new Thread(handleObj.HandleNewClient);
                    thread2.Start();
                }
                else if (!thread2.IsAlive)
                {
                    TcpClient client = server.AcceptTcpClient();
                    HandleClient handleObj = new HandleClient(client, myInventory);
                    thread2 = new Thread(handleObj.HandleNewClient);
                    thread2.Start();
                }
                if (thread3 == null)
                {
                    TcpClient client = server.AcceptTcpClient();
                    HandleClient handleObj = new HandleClient(client, myInventory);
                    thread3 = new Thread(handleObj.HandleNewClient);
                    thread3.Start();
                }
                else if (!thread3.IsAlive)
                {
                    TcpClient client = server.AcceptTcpClient();
                    HandleClient handleObj = new HandleClient(client,myInventory);
                    thread3 = new Thread(handleObj.HandleNewClient);
                    thread3.Start();
                }
            }


            if (thread1.IsAlive && thread2.IsAlive && thread3.IsAlive)
            {
                full = true;
                Console.Write("Server is full");
               // Console.ReadLine();
            }
            else
            {
                full = false;
                 Console.Write("Server is not full");
                //Console.ReadLine();
            }

        }

Класс HandleClient:

class HandleClient
{
    private StreamWriter StreamWriter { set; get; }
    private StreamReader StreamReader { set; get; }
    private TcpClient Client { set; get; }
    private NetworkStream NetworkStream { set; get; }
    private Inventory myInventory;
    public object Locker = new object();

    public HandleClient(TcpClient client, Inventory myInventory)
    {
        this.Client = client;
        this.myInventory = myInventory;
        this.NetworkStream = client.GetStream();
        this.StreamWriter = new StreamWriter(NetworkStream);
        this.StreamReader = new StreamReader(NetworkStream);
    }

    public void HandleNewClient()
    {
        Console.WriteLine("A new Client Connected!");
        String theString;
        try
        {


            string[] input = GetValidInput();
            lock (Locker)
            {
                input[0] = input[0].ToLower();
                input[1] = input[1].ToLower();
                if (input[0].Equals("r"))
                {
                    this.StreamWriter.WriteLine(this.myInventory.ReturnItem(input[1], Convert.ToInt32(input[2])));
                    //Console.WriteLine("wrote to clint");
                }
                else if (input[0].Equals("b"))
                {

                    this.StreamWriter.WriteLine(this.myInventory.BuyItem(input[1], Convert.ToInt32(input[2])));
                    // Console.WriteLine("wrote to clint");
                }
                this.StreamWriter.Flush();
            }


        }

        finally
        {
            //Console.WriteLine(Thread.CurrentThread.ManagedThreadId + "is about to close stuff");
            this.StreamReader.Close();
            this.StreamWriter.Close();
            this.NetworkStream.Close();
            this.Client.Close();

        }
    }

    private string[] GetValidInput()
    {
        bool valid = false;
        int numVal = -1;
        string[] values = new string[3];
        string theString = null;
        while (!valid)
        {
            while (String.IsNullOrEmpty(theString))
            {
                theString = StreamReader.ReadLine();
                Console.WriteLine("this is theString = " + theString);
            }

            values = theString.Split(',');
            if (values.Count() != 3)
            {
                this.StreamWriter.WriteLine("Invalid number of arguments please try again");
            }
            try
            {
                numVal = Convert.ToInt32(values[2]);
            }
            catch (FormatException e)
            {
                this.StreamWriter.WriteLine("thrid value is not a sequence of digits.");

            }
            if (numVal < 1)
            {
                this.StreamWriter.WriteLine("Number of items can not be 0 or less");
            }
            else
            {
                valid = true;
                Console.WriteLine("got Valid input");
            }
        }
        return values;
    }

Сторона Клинта:

class Client
{
    static void Main(string[] args)
    {
        for (int i = 0; i < 10; i++)
        {
            var newThread = new Thread(Client.ContatctServer);
            newThread.Start();
        }

    }

    public static void ContatctServer()
    {
        Random rnd = new Random();
        TcpClient socketForServer;
        try
        {
            socketForServer = new TcpClient("localHost", 12000);
        }
        catch
        {
            Console.WriteLine(
                "Failed to connect to server at {0}:12000", "localhost");
            return;
        }

            NetworkStream networkStream = socketForServer.GetStream();
            StreamReader streamReader = new StreamReader(networkStream);
        StreamWriter streamWriter = new StreamWriter(networkStream);

        try
        {


           // Console.WriteLine("Please enter a command in form (r/b,id,num");
            string myInstruction = RandomInstruction(rnd);
            streamWriter.WriteLine(myInstruction);

            // Console.WriteLine("Client Message");
            Console.WriteLine("Wrote " + myInstruction + " to Server.");
            streamWriter.Flush();
           string outputString = streamReader.ReadLine();
            Console.WriteLine("Here is the Servers response:");

            Console.WriteLine(outputString);
           // outputString = streamReader.ReadLine();
        }
        catch
        {
            Console.WriteLine("Exception reading from Server");
        }
        finally
        {
            // tidy up
            networkStream.Close();
            Console.ReadLine();
        }
    }

Чтобы подвести итог к лучшему и менее общему вопросу, есть ли что-то в приведенном выше коде, чтобы предположить, что мои потоки делятся потоками, когда их не должно быть? Если нет другой идеи о том, что может быть причиной IOException?

0 ответов

Другие вопросы по тегам