2009-11-17 10 views
2

J'ai une boucle while do qui lit une mémoire tampon à partir d'un NetworkStream objet la condition while est networkStream.CanRead tant qu'elle peut lire, elle doit continuer à lire à partir du tampon. Le seul problème est quand je lis du tampon et convertis en chaîne, il n'y a rien dedans. c'est-à-dire son vide.NetworkStream.CanRead renvoie true mais le tampon ne renvoie aucune valeur

Pourquoi cela se produirait-il?

Ceci est une application ASP.NET (de VS2005)

@dtb Info Code:

Je passe l'objet NetworkStreamnetworkStream

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

    ReadMessage(networkStream); 
} 

chose drôle est que si elle se reconnecte et se connecte à nouveau, le Send/Read fonctionne bien. Peut-il s'agir d'un problème avec Send (je ne reçois aucune exception ici) ou de la réutilisation de l'objet NetworkStream. Cela fonctionne correctement localement sur un serveur TCP de test, mais j'obtiens le problème ci-dessus en cours de production (Windows Server 2003) (ie ne peux rien lire du flux - jusqu'à ce que je l'expire (quitte la boucle) après 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

S'il vous plaît noter: qu'il lit un message dans la première fois, après une autre demande de données est envoyé sur le même flux de réseau cela se produit sur le 2ème go – soldieraman

+1

@soldieraman: Si la réponse de darkassassin93 ne répond pas à votre question, s'il vous plaît nous montrer votre code. J'ai l'impression que vous supposez des choses sur les limites de paquets et/ou le nombre d'octets renvoyés par la méthode 'Read' qui peut être faux. – dtb

+0

@dtb mettre du code info – soldieraman

Répondre

4

CanRead est une valeur statique qui indique si oui ou non le flux est capable d'être lu. La propriété DataAvailable vous indiquera si les données sont prêtes à être lues.

+0

+1. "valeur statique" signifie ici que la valeur est définie une fois par le constructeur et n'est jamais changée jusqu'à ce que la classe soit éliminée (auquel cas elle sera définie sur "false") – dtb

+0

Il y a des indications dans les commentaires dans d'autres questions sur SO que CanRead (et CanWrite aussi je suppose) peut être changé, et cela arrive quand le flux est fermé. Néanmoins, vous avez fondamentalement raison. –

Questions connexes