2010-12-10 57 views
0

Comment puis-je envoyer une chaîne multiligne avec des lignes vides sur un NamedPipe?Envoi d'une chaîne multiligne sur NamedPipe?

Si j'envoie une chaîne

string text= @"line 1 
line2 

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

je reçois sur le côté serveur uniquement "ligne 1":

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

Lorsque je tente quelque chose comme ça

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

Il se bloque dans la boucle pendant que le client est connecté et ne libère que lorsque le clie nt se déconnecte.

Des idées comment je peux obtenir le entière chaîne sans accrocher dans cette boucle? Je dois traiter la chaîne et la retourner de la même manière au client.

Il est important de conserver la mise en forme d'origine de la chaîne, y compris les lignes vides et les espaces.

Répondre

5

StreamReader est un lecteur orienté ligne. Il lira la première ligne (terminée par une nouvelle ligne). Si vous voulez le reste du texte, vous devez émettre plusieurs lignes de lecture. C'est:

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

Vous ne voulez pas « lire à la fin » sur un flux réseau, parce que ça va accrocher le lecteur jusqu'à ce que le serveur ferme la connexion. Cela pourrait être très long et pourrait déborder d'un tampon.

En règle générale, vous verrez ceci:

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 
    } 
} 

Cela vous donne chaque ligne comme il est reçu et prendra fin lorsque le serveur ferme le flux.

Si vous souhaitez que le lecteur traite l'intégralité de la chaîne multiligne en tant qu'entité unique, vous ne pouvez pas le faire de manière fiable avec StreamReader. Vous voudrez probablement utiliser un BinaryWriter sur le serveur et un BinaryReader sur le client.

+0

L'utilisation de BinaryWriter (message de chaîne) et de BinaryReader (message de chaîne) fonctionne comme un charme. Je vous remercie! – NKnusperer

1

Pourquoi ne pas simplement appeler ReadToEnd() sur StreamReader?

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

Même effet, il ne se libère que lorsque le client se connecte. – NKnusperer