Отправка многострочной строки через NamedPipe? - PullRequest
0 голосов
/ 10 декабря 2010

Как я могу отправить многострочную строку с пустыми строками через 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);
}

Он зависает в цикле, когда клиент подключен, и освобождается только при отключении клиента.

Любые идеи, как я могу получить целую строку без зависания в этом цикле? Мне нужно обработать строку и вернуть ее клиенту таким же образом.

Важно, чтобы я сохранил исходное форматирование строки, включая пустые строки и пробелы.

Ответы [ 3 ]

5 голосов
/ 10 декабря 2010

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 на клиенте.

1 голос
/ 10 декабря 2010

Почему бы просто не позвонить ReadToEnd() в StreamReader?

StreamReader sr = new StreamReader(server);
string message = sr.ReadToEnd();
0 голосов
/ 24 апреля 2018

Я выполнил отправку многострочных сообщений по именованному каналу, используя замену токенов, чтобы заменить все \ r и \ n в сообщении токенами, такими как {cr} и {lf}, таким образом, преобразовав сообщения из нескольких строк в 1 строку.

Конечно, мне нужно было выполнить обратное преобразование на стороне получателя.

Предполагается, что замещенные токены никогда не будут найдены в исходном тексте.

Вы можете убедиться, чточто это происходит, также заменяя все "{" на {lp}.Таким образом, "{" становится вашим escape-символом.

Вы можете использовать Regex для выполнения этих замен.

Это отлично сработало и позволило мне использовать StreamReader.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...