«Невозможно прочитать данные из транспортного соединения» - C # - PullRequest
5 голосов
/ 28 сентября 2010

Я начинаю окунуться в мир сетевого программирования, и недавно я наткнулся на довольно старый пример из учебного пособия для лекторов (или мне так сказали).

Мы попробовали это на университетских компьютерах, но это не сработало, поэтому лектор предположил, что это было связано с настройками безопасности либо в Windows 7, либо в университетских компьютерных системах.

Стремясь найти причину, я решил запустить тот же код дома на своем собственном компьютере, и неудивительно, что он не сработал.

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

Приложения работают до тех пор, пока сервер подтверждает, что он подключился к клиенту, но выдает исключение (которое перехватывается и обрабатывается) с текстом:

Невозможно прочитать данные из транспортного соединения: существующее соединение было принудительно закрыто удаленным хостом. - (System.IO.IOException)

Теперь, когда я только начинаю с сетевого программирования на C #, я не совсем уверен, где искать, мой лектор сказал, что он найдет на следующей неделе лекцию с указанием причины и решения проблемы, но я хотел проявите инициативу и узнайте себя.

Я добавил классы Client.cs и Server.cs на всякий случай, если они полезны, отладчик предлагает причину в строке 27 в Server.cs, вызов streamReader.Readline ();

Примечание : Это ни в коем случае не домашняя работа, мне просто любопытно, почему она не работает. Назовите это опытом обучения =]

Client.cs

using System;
using System.Net.Sockets;
using System.IO;

namespace NetworkProgrammingTutorial1Client
{
    class Client
    {
        static void Main(string[] args)
        {
            TcpClient myclient;

            try
            {
                // Create a TcpClient to talk to the local host.
                myclient = new TcpClient("localhost", 1234);
            }
            catch
            {
                Console.WriteLine("Failed to connect to the server.");
                return;
            }

            // get a Network stream from the server
            NetworkStream networkStream = myclient.GetStream();
            StreamWriter streamWriter = new StreamWriter(networkStream);

            streamWriter.WriteLine("Have a message.");
            streamWriter.Flush();
        }
    }
}

Server.cs

using System;
using System.Net.Sockets;
using System.Net;
using System.IO;

namespace NetworkProgrammingTutorial1Server
{
    class Server
    {
        static void Main(string[] args)
        {
            // TcpListener is listening on the given port...                                                 {
            TcpListener tcpListener = new TcpListener(1234);
            tcpListener.Start();     
            Console.WriteLine("Server Started") ;                  
            // Accepts a new connection...
            Socket socketForClient = tcpListener.AcceptSocket();                   
            try
            {
                if (socketForClient.Connected)
                {
                    while (true)
                    {
                        Console.WriteLine("Client connected");
                        NetworkStream networkStream = new NetworkStream(socketForClient);
                        StreamReader streamReader = new StreamReader(networkStream);
                        string line = streamReader.ReadLine();
                        if (line == null)
                            break;
                        Console.WriteLine(line);
                    }
                }

                socketForClient.Close();               
                Console.WriteLine("Exiting...");
            }
            catch(Exception e)
            {
                Console.WriteLine(e.ToString()) ;
            }
        }
    }
}

1 Ответ

1 голос
/ 28 сентября 2010

Попробуйте этот код сервера:

TcpListener listener = new TcpListener(IPAddress.Any, 1234);
listener.Start();     

using (TcpClient client = listener.AcceptTcpClient())
using (StreamReader reader = new StreamReader(client.GetStream()))
{
    string line;
    while ((line = reader.ReadLine()) != null)
    {
        Console.WriteLine(line);
    }
}

listener.Stop();

Он прослушивает порт 1234, принимает одного клиента, создает StreamReader и выводит все строки, отправленные клиентом, до тех пор, пока клиент не закроет соединение.Затем он прекращает прослушивание и завершает работу.

Как видите, создается только один StreamReader (не для каждой строки неоднократно), и как TcpClient, так и StreamReader удаляются оператором using, когда выготово.


Ваш код клиента должен работать.Хорошей идеей также является размещение объектов здесь:

using (TcpClient client = new TcpClient("localhost", 1234))
using (StreamWriter writer = new StreamWriter(client.GetStream()))
{
    writer.WriteLine("Have a message.");
    writer.Flush();

    writer.WriteLine("Have another message.");
    writer.Flush();
}
...