2016-04-08 1 views
0

Je ne peux pas cet exemple pour exécuter: https://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient%28v=vs.110%29.aspxNetworkStream.Read jette pas exception

La seule chose Ive changé avec leur code est de tout mettre dans la principale méthode, et mon nom de port bien sûr. Je peux me connecter à mon serveur et même envoyer des données. Mais sur la ligne

Int32 bytes = networkStream.Read(data, 0, data.Length); 

Le programme s'arrête sans exception. Comment Microsoft propre code ne fonctionne pas? Mon serveur n'envoie rien encore, mais je ne pense pas que cela devrait importer? (Il reçoit parfaitement cependant.) Ive Lisez quelque chose que vous ne pouvez pas distinguer des exceptions dans d'autres discussions, mais je n'en ai pas. J'ai également essayé ce fil: C# tcp socket (networkstream.read won't work with 8.1)

Il ne fonctionne pas. Je cours gagner 7 thoguh. Mais je souhaite que cela fonctionne toutes les nouvelles fenêtres.

+0

La lecture est un appel synchrone. Qu'est-ce que vous envoyez du serveur? – Nemo

+1

Read() bloquera/arrêtera, attendant que certaines données soient reçues. Pour contourner ce blocage, vous pouvez ajouter 'if (networkStream.IsDataAvailable)' avant de lire. De cette façon, il ne devrait jamais être bloquant. –

+0

@ThariqNugrohotomo et si ça retourne faux? Cela ne veut pas dire qu'il n'y a pas de données! IsDataAvailable ne fonctionne pas pour cela. – usr

Répondre

2

NetworkStream.Read jusqu'à ce que les données soient disponibles, la connexion est fermée (elle renverra 0 dans ce cas) ou une exception se produit. C'est conçu de cette façon.

Si votre serveur enverrait des données, votre programme client continuerait et pourrait traiter la réponse. NetworkStream.Read() est un appel synchrone, il attendra la réception d'une réponse.

+0

Semblerait être le cas. Comportement très étrange je dois dire. Il semble y avoir un changement dans l'exécution de cette commande, car les anciens exemples en ligne utilisent tous quelque chose comme une lecture dans leur boucle while. Je dois maintenant utiliser quelque chose comme while (stream.dataavailble) puis lire dans la boucle while. –

+0

@StaffanMattsson: Il n'y a pas de changement dans l'exécution. Les exemples ont 'Read()' dans la boucle parce qu'ils peuvent probablement permettre le bloc (c'est-à-dire dans un autre thread). Ça a toujours été bloquant si je ne me trompe pas. –

+0

@StaffanMattsson: Il est même indiqué dans la documentation 'NetworkStream.Read()' pour dès que .NET Framework 1.1 que _ ** "Si aucune donnée n'est disponible pour la lecture, la méthode NetworkStream.Read se bloque jusqu'à ce que les données soient disponibles. "** _. Lien: https://msdn.microsoft.com/en-us/library/system.net.sockets.networkstream.read(v=vs.71).aspx –

0

Pour lire des données de différentes longueurs, vous pouvez faire quelque chose comme ci-dessous.

REMARQUE: Je suppose que le serveur envoie une seule réponse pour une requête.

private string GetResponse(string command) 
{ 
    //Send request 
    TcpClient client = new TcpClient(HOST, PORT); 
    Byte[] data = Encoding.ASCII.GetBytes(command); 
    NetworkStream stream = client.GetStream(); 
    stream.Write(data, 0, data.Length); 

    //Read response 
    data = new Byte[BUFFER_SIZE]; 
    String response = String.Empty; 
    stream.ReadTimeout = READ_TIMEOUT; 
    while (!response.EndsWith(RESPONSE_END)) 
    { 
     int bytes = stream.Read(data, 0, data.Length); 
     response += Encoding.ASCII.GetString(data, 0, bytes); 
    } 
    response = response.Remove(response.Length - RESPONSE_END.Length); 
    stream.Close(); 
    client.Close(); 

    //Return 
    return response; 
} 
+0

Cela a un bug car il peut lire plusieurs messages à la fois, ou un message plus un partiel. – usr

+0

@usr Vrai, si plusieurs réponses sont envoyées par le serveur. Dans cet exemple, je suppose que le serveur envoie une seule réponse pour une requête. – Nemo

+0

Bon, je n'ai pas pensé à cette possibilité. – usr