2017-02-20 7 views
0

Ich erstelle gerade einen Client, der mit einem Server kommuniziert. Bis jetzt war jede Kommunikation nicht länger als eine Zeile, so dass ich Streamreader readline benutzen konnte, um die Kundeneingaben zu erhalten. Allerdings habe ich jetzt Befehle, die mehrere Zeilen Code sind, aber der Server liest nur in der ersten Zeile, wie ich readline() verwendet habe. Ich habe readtoend() versucht, aber wenn ich dies tue, schlägt die Verbindung zwischen dem Server und dem Client aus irgendeinem Grund fehl.C# Server liest nicht mehrere vom Client gesendete Zeilen

Im Folgenden ist der Code in meinem Client, ein Beispiel, das einen Befehl zeigt, die aus mehreren Zeilen bestehen gesendet werden:

else if (args.Length == 1) 
       { 
        sw.WriteLine("GET" + " /?name=" + args[0] + " HTTP/1.1"); 
        sw.WriteLine("HOST: " + host); 
        sw.WriteLine(""); 
        sw.Flush(); 
       } 

Und hier ist das in meinem Server-Code, der in der Zeile lautet:

string line = sr.ReadToEnd().Trim(); 
     Console.WriteLine("Respond Recieved " + line); 
     String[] Sections = line.Split(new char[] { ' ' }, 2); 

Also, das Problem zu klären, wenn ich den Befehl gesendet, wie oben auf den Server gezeigt, die Antwort vom Server wäre „Antwort erhalten: GET“ + „/? name =“ + args [0 ] + "HTTP/1.1" und nicht die anderen Zeilen.

Jede Hilfe würde sehr geschätzt werden!

Danke

Lucy

+0

Nun schließt alle Daten lesen alles ist? Wenn nicht, wann erwarten Sie, dass 'ReadToEnd' zurückkehrt? –

+0

Woher wird Ihr readtoend aufgerufen? Woher weiß es, wann es schießt? – BugFinder

+2

Sie scheinen auch einen HTTP-Client zu schreiben, können Sie stattdessen nicht den eingebauten 'HttpClient' verwenden? – DavidG

Antwort

0

Können Sie den folgenden Code versuchen, den ich von diesem link bekam?

  using (StreamReader sr = new StreamReader(path)) 
      { 
       while (sr.Peek() >= 0) 
       { 
        Console.WriteLine(sr.ReadLine()); 
       } 
      } 
1

ReadToEnd() kann auf unbestimmte Zeit auf nicht Schließen Strömen wie Network blockiert. Ich würde vermuten, dass der Fehler, den Sie bekommen, eine Zeitüberschreitung oder etwas ähnliches ist?

Der einfachste Weg, die Kopfzeilen zu lesen, besteht darin, einfach ReadLine() mehrmals anzurufen. Wenn NULL zurückgegeben wird, bedeutet das Ende des Streams (Client getrennt, wahrscheinlich eine Fehlerbedingung, es sei denn, Connection: Closed wurde angegeben und Sie haben eine leere Zeile gelesen). Eine leere Zeile bedeutet, dass Sie das Ende der Header erreicht haben. Danach kommt der optionale Anfragetext, der durch den optionalen Header Content-Length spezifiziert wird.

Denken Sie daran, dass StreamReader Daten puffert! Dies ist wichtig, wenn der Inhaltskörper etwas anderes als ASCII-Text ist.

Generell glaube ich nicht, dass Sie HTTP-Lesen selbst implementieren sollten, aber es ist eine interessante Lernerfahrung in einem wichtigen Standard.

0

Sie können die Verbindung

using (StreamReader sr = new StreamReader(filePath)) 
    { 
    string line; 
     while ((line = sr.ReadLine()) != null) 
     { 
      Console.WriteLine(line); 
      //Or do your work here. 
     } 
    } 
+0

Während deine Antwort gut genug ist, kannst du etwas Kontext hinzufügen, um den Fragen zu helfen. Verstehst du deinen Code? –

Verwandte Themen