2010-12-10 122 views
0

如何在NamedPipe上發送帶空行的多行字符串?通過NamedPipe發送多行字符串?

如果我發送一個字符串

string text= @"line 1 
line2 

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

我得到在服務器端只「1號線」

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

當我嘗試這樣的事情

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

當客戶端連接時,它掛在循環中,只有在客戶端連接時纔會釋放nt斷開連接。

任何想法如何我可以得到整個字符串沒有掛在這個循環? 我需要處理該字符串並以相同的方式將其返回給客戶端。

重要的是我保留字符串的原始格式,包括空白行和空格。

回答

5

StreamReader是一個面向行的閱讀器。它會讀取第一行(以換行符結尾)。如果你想要其餘的文本,你必須發出多條readline。即:

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

您不想在網絡流上「讀取到結尾」,因爲這會掛起讀取器直到服務器關閉連接。這可能會很長時間,並可能溢出緩衝區。

通常情況下,你會看到這一點:

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

這就給了你,因爲它是收到的每一行,並在服務器關閉的流將終止。

如果您希望讀者將整個多行字符串作爲單個實體進行處理,您無法可靠地使用StreamReader進行處理。您可能想在服務器上使用BinaryWriter,在客戶端上使用BinaryReader

+0

使用BinaryWriter(字符串消息)和BinaryReader(字符串消息)就像一個魅力。謝謝! – NKnusperer 2010-12-10 21:02:32

1

爲什麼不直接在StreamReader上調用ReadToEnd()

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

同樣的效果,他只在客戶端連接時釋放。 – NKnusperer 2010-12-10 20:01:52