2016-04-08 25 views
0

ich nicht dieses Beispiel bekommen laufen: https://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient%28v=vs.110%29.aspxNetworkStream.Read wirft keine Ausnahme

Das einzige, was Ive mit ihrem Code geändert ist alles im Hauptverfahren zu setzen, und meine Portnamen natürlich. Ich kann eine Verbindung zu meinem Server herstellen und sogar Daten senden. Aber auf der Linie

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

Das Programm stoppt ohne Ausnahme. Wie kann Microsoft eigenen Code nicht funktionieren? Mein Server sendet noch nichts, aber ich denke nicht, dass das wichtig sein sollte? (Es wird jedoch perfekt empfangen.) Ive Lesen Sie etwas, dass Sie Ausnahmen in anderen Threads nicht sehen können, aber ich habe keine. Ich habe auch versucht, dieses Thema: C# tcp socket (networkstream.read won't work with 8.1)

Es funktioniert nicht. Ich laufe Sieg 7 thoguh. Aber ich wünsche, dass dies ein ganz neues Fenster funktioniert.

+0

Lesen ist ein synchroner Anruf. Was senden Sie vom Server? – Nemo

+1

Read() blockiert/stoppt und wartet, bis Daten empfangen werden. Um dieses Problem zu umgehen, können Sie 'if (networkStream.IsDataAvailable)' vor dem Lesen hinzufügen. Auf diese Weise sollte es niemals blockieren. –

+0

@ThariqNugrohotomo und was ist, wenn es falsch zurückgibt? Das heißt nicht, dass es keine Daten gibt! IsDataAvailable funktioniert dafür nicht. – usr

Antwort

2

NetworkStream.Read blockiert, bis Daten verfügbar sind, die Verbindung wird geschlossen (in diesem Fall wird 0 zurückgegeben) oder eine Ausnahme tritt auf. Es ist so konzipiert.

Wenn Ihr Server Daten senden würde, würde Ihr Client-Programm fortfahren und in der Lage sein, die Antwort zu verarbeiten.

+0

Scheint so zu sein. Sehr seltsames Verhalten muss ich sagen. Es scheint auch eine Änderung in der Ausführung dieses Befehls zu geben, da alte Online-Beispiele alle so etwas wie ein Read in ihrer while-Schleife verwenden. Ich muss jetzt etwas wie while (stream.dataavailble) verwenden und dann innerhalb der while-Schleife lesen. –

+0

@StaffanMattsson: Es gibt keine Änderung in der Ausführung. Die Beispiele haben 'Read()' in der Schleife, weil sie sich wahrscheinlich den Block leisten können (d. H. Es ist in einem anderen Thread). Es hat immer blockiert, wenn ich mich nicht irre. –

+0

@StaffanMattsson: Es wird sogar schon in der 'NetworkStream.Read()' -Dokumentation für .NET Framework 1.1 angegeben, dass _ ** "Wenn keine Daten zum Lesen verfügbar sind, blockiert die NetworkStream.Read-Methode solange, bis Daten verfügbar sind. "** _. Link: https://msdn.microsoft.com/en-us/library/system.net.sockets.networkstream.read (v = vs.71).aspx –

0

NetworkStream.Read() ist ein synchroner Aufruf, es wird gewartet, bis eine Antwort empfangen wird. Um Daten unterschiedlicher Länge zu lesen, können Sie Folgendes tun.

HINWEIS: Ich nehme an, Server sendet nur eine Antwort für eine Anfrage.

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

Dies hat einen Fehler, weil es mehrere Nachrichten gleichzeitig lesen kann, oder eine Nachricht plus eine teilweise Nachricht. – usr

+0

@usr Richtig, wenn mehrere Antworten vom Server gesendet werden. In diesem Beispiel nehme ich an, dass der Server nur eine Antwort für eine Anfrage sendet. – Nemo

+0

Richtig, ich dachte nicht an diese Möglichkeit. – usr