1

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

クライアントが接続されている間はループでハングし、クライアントが切断されたときにのみ解放されます。

このループにぶら下がらずに文字列全体を取得する方法はありますか? 文字列を処理し、同じ方法でクライアントに返す必要があります。

空白行や空白を含む文字列の元の書式を維持することが重要です。

4

3 に答える 3

5

StreamReader行指向のリーダーです。最初の行 (改行で終了) を読み取ります。残りのテキストが必要な場合は、複数の readlines を発行する必要があります。あれは:

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

于 2010-12-10T20:46:06.493 に答える
1

ReadToEnd()StreamReader を呼び出さないのはなぜですか?

StreamReader sr = new StreamReader(server);
string message = sr.ReadToEnd();
于 2010-12-10T19:52:48.033 に答える