2010-11-03 6 views
0

J'ai une configuration de connexion tcpclient capturant un flux http continu. Pour une raison quelconque, après la lecture des premiers octets, le flux n'obtient aucune donnée pendant longtemps. Y a-t-il un problème avec mon code?tcpclient getstream - zéro octet lu

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 

Répondre

2

Tout d'abord, vous ne devriez pas absolument lire les données de caractères de cette façon. Vous supposez que votre tableau d'octets contient toujours un nombre entier de caractères. Vous devriez utiliser un StreamReader à la place, qui est conçu pour gérer cela.

Si vous devez absolument lire directement à partir du flux, utilisez une seule instance de Decoder qui peut gérer ces caractères partiels, en mémoire tampon pour la conversion suivante.

Maintenant, vous êtes également nécessitant que numbytesread > 1 - et si c'est exactement 1? Pourquoi voudriez-vous ignorer cela?

On ne sait pas non plus à quoi correspond votre horodatage ... le flux ne va-t-il pas bloquer indéfiniment jusqu'à ce qu'il obtienne des données? Ou avez-vous explicitement mis en place avec un timeout de lecture?

+0

Merci pour votre réponse. Je ne savais pas comment capturer le flux et pris conseil d'un autre prgmmer..mais je vais regarder soit en utilisant streamreader ou le décodeur ..Oh oui je me souviens maintenant pourquoi j'ai utilisé le réseau, je ne pouvais pas lire à partir d'un tcpclient.getstream en utilisant un streamreader.What exactement voulez-vous dire par le flux bloquant indéfiniment et le timeout de lecture .. Je pensais que si je ne reçois rien dans le flux pendant plus d'une minute, j'ai besoin de se reconnecter. – vbNewbie