Приложение клиент-сервер C #, BinaryReader выдает исключение - PullRequest
0 голосов
/ 28 января 2011

У меня есть задача создать серверное приложение, которое проверяет, существует ли какой-либо файл на сервере (имя которого должно быть отправлено клиентом) и существует ли он для ответа (сообщение - «Этот файл существует.«).У меня проблема с этим.Сервер делает правильные вещи, но когда я пытаюсь использовать BinaryReader для чтения ответа, он возвращает мне следующее исключение:

Unable to read beyond the end of the stream

Вот некоторый код от клиента:

    private void OnRequest()
    {
        try
        {
            IPEndPoint serverIp = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 55555);
            TcpClient client = new TcpClient();
            client.Connect(serverIp);
            if (client.Connected)
            {
                AddLog("Connected!");

                writer = new BinaryWriter(client.GetStream());

                writer.Write("request");
                GetFileText();
                writer.Write(fileText);
                writer.Flush();

                AddServerResponse(GetResponse(client.Client));

                writer.Close();
                client.Close();
                AddLog("Disconnected!");
            }

        }
        catch (Exception e)
        {
            MessageBox.Show(e.Message, "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

И это метод GetResponse:

    private string GetResponse(Socket server)
    {
        NetworkStream stream = new NetworkStream(server);
        reader = new BinaryReader(stream);
        string message;
        do
        {
            message = reader.ReadString();
        }
        while (message != null);
        reader.Close();
        return message;
    }

А вот как я отправляю данные клиенту:

    private void SendDataToClient(string data, Socket client)
    {
        if (client != null && client.Connected)
        {
            NetworkStream stream = new NetworkStream(client);
            BinaryWriter writer = new BinaryWriter(stream);
            writer.Write(data);
            writer.Flush();
            writer.Close();
            stream.Close();
        }
    }

Не могли бы вы мне помочь, пожалуйста?

Ответы [ 3 ]

0 голосов
/ 28 января 2011

TCP - это потоковый протокол, а не протокол, ориентированный на сообщения. Это означает, что все гарантировано доставлено в правильном порядке, а затем получено все или ничего. Тем не менее, это не означает, что все поступит с одинаковым чтением.

Вам необходимо убедиться, что все было получено правильно, прежде чем пытаться прочитать его.

Google некоторые на NetworkStream и посмотреть, как другие используют его в серверных приложениях. Вы обычно отправляете заголовок, а затем данные.

0 голосов
/ 28 января 2011

После прочтения строки вы обнаруживаете это сообщение! = Null и цикл снова запускается. Но сервер ничего не записал в поток, поэтому при попытке прочитать следующую строку нечего читать. Каждый ReadString сначала читает длину строки, а затем данные строки (см. http://msdn.microsoft.com/en-us/library/system.io.binaryreader.readstring.aspx).. Сервер даже не сделал длину строки доступной для чтения, поэтому вы получаете сообщение об ошибке. Я думаю, что именно так и происходит. Вам нужен какой-то индикатор о том, как долго поток или когда вы достигли конца.

0 голосов
/ 28 января 2011

Я ожидаю, что поток не предоставил полностью двоичный граф объектов, и поэтому BinaryReader пытается десериализовать частичный объект.

...