2009-11-17 3 views
2

У меня есть цикл while, который считывает буфер из объекта NetworkStream Условие while равно networkStream.CanRead, пока оно может читать, оно должно продолжать чтение из буфера. Единственная проблема - когда я читаю из буфера и конвертирую в строку, в ней нет ничего. т.е. пустым.NetworkStream.CanRead возвращает true, но буфер не возвращает значение

Зачем это произошло?

Это ASP.NET (VS2005) применение

@dtb Код Info:

Я передаю в NetworkStream объект networkStream

// between 2 functions in a loop 
{ 
    SendMessage(networkStream, message); 

    ReadMessage(networkStream); 
} 

Забавно, что если он подключится и снова подключается, функция Send/Read отлично работает. Может быть, это проблема с Send (я не получаю здесь никаких исключений) или повторное использование объекта NetworkStream. Это нормально работает на тестовом TCP-сервере, но я получаю вышеуказанную проблему при производстве (Windows Server 2003) (т. Е. Не могу прочитать что-либо из потока), пока я на самом деле не выйду из него (выйдите из цикла) после 10s)

ReadMessage(networkStream) 
{ 
    if (networkStream != null && networkStream.CanRead) 
    { 
     byte[] myReadBuffer = new byte[1024]; 
     StringBuilder myCompleteMessage = new StringBuilder(); 

     do 
     { 
      int numberOfBytesRead = networkStream.Read(myReadBuffer, 0, myReadBuffer.Length); 
      string messageRead = Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead); 
      myCompleteMessage.Append(messageRead); 
     } while (networkStream.CanRead); 
    } 
} 
+0

Обратите внимание: что он прочитал сообщение в первый раз, после того, как другой запрос данных отправлен в том же сетевом потоке, это происходит на втором ходу – soldieraman

+1

@soldieraman: Если ответ darkassassin93 не отвечает на ваш вопрос, пожалуйста, покажите нам свой код. У меня такое ощущение, что вы принимаете вещи о границах пакетов и/или количестве байтов, возвращаемых методом 'Read', который может быть неправильным. – dtb

+0

@dtb помещает некоторую информацию о коде – soldieraman

ответ

4

CanRead является статическим значением, которое указывает, является ли поток способен считываться. Свойство DataAvailable сообщит вам, готовы ли данные для чтения.

+0

+1. «статическое значение» здесь означает, что значение задается конструктором один раз и никогда не изменяется до тех пор, пока класс не будет удален (в этом случае он будет установлен на «false»). – dtb

+0

. Есть указания в комментариях в других вопросах о SO, которые CanRead (и CanWrite тоже, я полагаю) может быть изменен, и это происходит, когда поток закрыт. Тем не менее, вы в основном правы. –

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