2010-11-03 3 views
0

У меня есть настройка подключения tcpclient, фиксирующая непрерывный поток HTTP. По какой-то причине после чтения первых нескольких байтов поток не получает никаких данных в течение длительного времени. Есть ли проблема с моим кодом?tcpclient getstream - нулевые байты считаются

Dim tclient As TcpClient = New TcpClient(url, "80") 
    nstream = tclient.GetStream() 
    If nstream.CanRead Then 
       defaultsize = 8000, BUFFER_SIZE = 1024 
       Dim bufferread(defaultSize) As Byte 
       Dim data As String 
       mstring = New StringBuilder 
       numbytesread = 0 
       Dim timestamp As DateTime = DateTime.Now 

       Do 
        numbytesread = nstream.Read(bufferread, 0, BUFFER_SIZE) 

        If numbytesread > 1 Then 
         timestamp = DateTime.Now 
         data = Encoding.UTF8.GetString(bufferread, 0, numbytesread) 
         parsingUtilities.appendXMLtoFile(data) 
        End If 
        If DateTime.Now.Subtract(timestamp).TotalSeconds > 60 Then 
      'timestamp shows no bytesread for more than 60 seconds, then reconnect 
         Exit Sub 
        End If 

       Loop While tclient.Connected 
      End If 

ответ

2

Во-первых, вы абсолютно не должны считывать данные символов таким образом. Вы предполагаете, что ваш массив байтов всегда содержит целые числа символов. Вместо этого вы должны использовать StreamReader, который предназначен для обработки этого.

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

Вы также являетесь пользователем , которому требуется, что numbytesread > 1 - что, если это точно 1? Почему вы хотите проигнорировать это?

Это также непонятно, какова ваша временная метка ... это не поток, который будет блокировать неопределенно, пока он не получит некоторые данные? Или вы явно настроили его с таймаутом чтения?

+0

Спасибо за ваш ответ. Я не был уверен, как захватить поток и получить советы от другого prgmmer .. но я буду рассматривать либо использование streamreader, либо декодер. О да, я помню, почему я использовал сетевой поток, я не мог читать из tcpclient.getstream используя streamreader.Что именно вы подразумеваете под потоком, блокирующим неограниченное время и таймаутом чтения. Я думал, что если я не получу ничего в потоке больше минуты, мне нужно снова подключиться. – vbNewbie

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