2010-12-10 17 views
0

Wie kann ich eine mehrzeilige Zeichenfolge mit Leerzeilen über eine NamedPipe senden?Senden einer mehrzeiligen Zeichenfolge über NamedPipe?

Wenn ich sende einen String

string text= @"line 1 
line2 

line four 
"; 
StreamWriter sw = new StreamWriter(client); 
sw.Write(text); 

ich auf der Server-Seite bekommen nur "Linie 1":

StreamReader sr = new StreamReader(server); 
string message = sr.ReadLine(); 

Wenn ich versuche, so etwas wie dieses

StringBuilder message = new StringBuilder(); 
string line; 
while ((line = sr.ReadLine()) != null) 
{ 
    message.Append(line + Environment.NewLine); 
} 

Es hängt in der Schleife, während der Client verbunden ist und nur wenn der Client freigibt Nt trennt die Verbindung.

Irgendwelche Ideen, wie ich die ganze Schnur erhalten kann, ohne in dieser Schleife zu hängen? Ich muss die Zeichenfolge verarbeiten und auf dem gleichen Weg an den Client zurückgeben.

Es ist wichtig, dass ich die ursprüngliche Formatierung der Zeichenfolge beibehalten, einschließlich Leerzeilen und Leerzeichen.

Antwort

5

StreamReader ist ein zeilenorientierter Leser. Es liest die erste Zeile (durch eine neue Zeile beendet). Wenn Sie den Rest des Textes wollen, müssen Sie mehrere Leseleitungen ausgeben. Das heißt:

StreamReader sr = new StreamReader(server); 
string message = sr.ReadLine(); // will get "line1" 
string message2 = sr.ReadLine(); // will get "line2" 

Sie wollen nicht zu „lesen beenden“ auf einem Netzstrom, denn das wird den Leser hängen, bis der Server die Verbindung schließt. Das könnte sehr lange dauern und könnte einen Puffer überlaufen.

Normalerweise werden Sie sehen:

NetworkStream stream = CreateNetworkStream(); // however you're creating the stream 
using (StreamReader reader = new StreamReader(stream)) 
{ 
    string line; 
    while ((line = reader.ReadLine()) != null) 
    { 
     // process line received from stream 
    } 
} 

, dass Sie jede Zeile gibt, wie es empfangen wird, und wird beendet, wenn der Server den Stream schließt.

Wenn der Leser die gesamte mehrzeilige Zeichenfolge als einzelne Entität verarbeiten soll, können Sie dies nicht zuverlässig mit StreamReader tun. Wahrscheinlich möchten Sie einen BinaryWriter auf dem Server und einen BinaryReader auf dem Client verwenden.

+0

Die Verwendung von BinaryWriter (String-Nachricht) und BinaryReader (String-Nachricht) funktioniert wie ein Zauber. Vielen Dank! – NKnusperer

1

Warum nicht einfach ReadToEnd() auf StreamReader anrufen?

StreamReader sr = new StreamReader(server); 
string message = sr.ReadToEnd(); 
+0

Gleicher Effekt, den er nur freigibt, wenn der Client schließt. – NKnusperer

Verwandte Themen