Comment obtenir toutes les données de NetworkStream
Je suis en train de lire toutes les données présentes dans la mémoire tampon de l'ordinateur connecté par le biais de TCP/IP
mais je ne sais pas pourquoi je ne reçois pas toutes les données ,certaines données sont Manqués.
Voici le code que j'utilise ..
using (NetworkStream stream = client.GetStream())
{
byte[] data = new byte[1024];
int numBytesRead = stream.Read(data, 0, data.Length);
if (numBytesRead > 0)
{
string str= Encoding.ASCII.GetString(data, 0, numBytesRead);
}
}
S'il vous plaît dites-moi ce que je suis absent pour obtenir toutes les données de la machine.
Merci d'avance..
aucune chance que cela peut avoir quelque chose à voir avec le fait que vous êtes explicitement la lecture à plus de 1024 octets?
Ok, Donc comment puis-je lire toutes les données?
Ce qui est exactement manquant? Commencer du ruisseau, à la fin ou octets aléatoires? Êtes-vous en mesure de reconnaître fin du flux de données à partir de la séquence d'octets? Connaissez-vous la durée prévue des données?
Il en manque d'octets aléatoires.Et la longueur des données n'est pas connue, elle peut être n'importe quoi?
Non, il ne peut pas être n'importe quoi. Vous avez besoin de définir un protocole si vous ne voulez pas attendre jusqu'à ce que le client ferme la connexion. Autrement - continuer la lecture jusqu'à ce que le client ferme la connexion.
Ok, Donc comment puis-je lire toutes les données?
Ce qui est exactement manquant? Commencer du ruisseau, à la fin ou octets aléatoires? Êtes-vous en mesure de reconnaître fin du flux de données à partir de la séquence d'octets? Connaissez-vous la durée prévue des données?
Il en manque d'octets aléatoires.Et la longueur des données n'est pas connue, elle peut être n'importe quoi?
Non, il ne peut pas être n'importe quoi. Vous avez besoin de définir un protocole si vous ne voulez pas attendre jusqu'à ce que le client ferme la connexion. Autrement - continuer la lecture jusqu'à ce que le client ferme la connexion.
OriginalL'auteur shubham Hegdey | 2014-09-26
Vous devez vous connecter pour publier un commentaire.
Le problème avec ton code, c'est que vous n'aurez pas toutes les données si la taille des données est plus grand que la taille de la mémoire tampon (1024 octets dans votre cas), de sorte que vous avez à Lire le flux à l'intérieur de la boucle. Ensuite, vous pouvez
Write
toutes les données à l'intérieur d'unMemoryStream
jusqu'à la fin de laNetworkStream
.str
nous allons obtenir les données ligne par ligne droite ?Non, dans str, vous obtiendrez l'ensemble de la chaîne qui est stocké dans le
NetworkStream
le temps de la lire.Vous dire que toutes les données disponibles dans la mémoire tampon .Suis-je le droit?
Oui, vous avez raison.
Être prudent. Cette solution de FERMER la connexion après
using
fin de section.OriginalL'auteur GeorgeChond
Cet exemple de MSDN: NetworkStream.DataAvailable montre comment vous pouvez utiliser cette propriété pour le faire:
NetworkStream.DataAvailable
fiable pour l'OP du but? Quand est-il devenufalse
?Je devient faux lorsque plus de données sont dans le support, et pourquoi ne serait pas fiable?
Pas de.
NetworkStream.DataAvailable
êtrefalse
indique simplement il n'y a pas de données dans le récepteur du tampon de réception. Cela ne signifie pas que l'expéditeur envoi, donc il ne peut pas être utilisé pour mettre en œuvre un protocole et il ne résolvent pas les OP du problème.Lisez vous-même, vous dites, je suis à droite, et il a demandé à la lecture de toutes les données dans le flux. Vous allez un peu plus loin et je suis d'accord avec vous, il doit mettre en œuvre un protocole, mais ce n'est pas la question ici, il demande comment faire pour lire toutes les données dans le flux.
Je doute fort que ce soit ce que l'OP veut, mais vous avez raison.
OriginalL'auteur dariogriffo
Essayez ce code:
Espère que cette aide, il doit prévenir que vous n'avez pas toutes les données transmises pour vous.
OriginalL'auteur Paul Weiland
Essayez ceci:
OriginalL'auteur Popa Andrei
TCP lui-même n'a pas de manières de définir la "fin des données de l'état". C'est la responsabilité de l'application au niveau portocol.
Voir par exemple HTTP demande description:
Donc, pour demander la fin des données est déterminée par deux séquences de saut de ligne. Et pour la réponse:
Le contenu de la réponse de la taille est spécifiée dans l'en-tête de données.
Donc, c'est à vous de la façon de coder la quantité de données transférées à la fois - il peut être tout d'abord 2 ou 4 octets au début de la banque de données de taille pour les lire ou les plus complexes des moyens si nécessaire.
OriginalL'auteur dewaffled
pour mon scénario, le message lui-même est dire la longueur du message. voici le code
OriginalL'auteur Asad Durrani
Joindre à cette question un peu en retard, mais je me demandais moi-même ce que la plus élégante façon de le faire était. Lorsque le protocole n'est pas connu..
Et c'est ma conclusion
Les boucles while mentionné dans les réponses précédentes ne fonctionnent pas correctement sur NetworkStream, ils ne parviennent pas, et vous n'obtenez pas de données du tout.
Je n'ai pas essayé le DataAvailable, et ne sachant pas comment il fonctionne, je préfère ma version qui n'importe qui peut comprendre.
OriginalL'auteur Johan Sonesson