2011-01-28 3 views
0

У меня есть задача создать серверное приложение, которое проверяет наличие какого-либо файла на сервере (имя которого должно быть отправлено клиентом), и если оно существует, чтобы вернуть response (message - «Этот файл существует»). У меня проблемы с этим. Сервер делает правильно, но когда я пытаюсь использовать мой BinaryReader прочитать ответ он возвращает мне это исключение:Приложение клиентского сервера C#, 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(); 
     } 
    } 

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

+0

Я не вижу, где вы проверяете, пришли ли все данные/где вы буферизируете данные. – CodesInChaos

ответ

0

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

+0

Я видел свою ошибку ... Действительно глупо. Спасибо! –

0

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

+0

Я отправляю информацию клиенту с BinaryWriter. –

+0

@ own3r: Да, но все это было получено? –

0

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

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

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

Смежные вопросы