Сервер именованных каналов и клиент - нет сообщений

2

Я пытаюсь научиться делать Именованные каналы. Поэтому я создал сервер и клиент в LinqPad.

Вот мой сервер:

var p = new NamedPipeServerStream("test3", PipeDirection.Out);
p.WaitForConnection();
Console.WriteLine("Connected!");
new StreamWriter(p).WriteLine("Hello!");
p.Flush();
p.WaitForPipeDrain();
p.Close();

Вот мой клиент:

var p = new NamedPipeClientStream(".", "test3", PipeDirection.In);
p.Connect();
var s = new StreamReader(p).ReadLine();
Console.Write("Message: " + s);
p.Close();

Я запускаю сервер, а затем клиент, и я вижу "Connected!". появляются на сервере, поэтому он правильно подключается. Тем не менее, клиент всегда отображает Message: без ничего после него, поэтому данные фактически не переходят с сервера на клиент для отображения. Я уже пробовал перекодировать направления трубопроводов и отправить клиенту данные на сервер с тем же результатом.

Почему в этом примере не распечатываются данные на экране? Что мне не хватает?

Спасибо!

  • 0
    Согласно документам StreamReader.ReadLine, он вернет ноль, если достигнут конец потока. Может случиться так, что во время выполнения ReadLine в канале нет данных и поток пуст. Возможно, вы захотите вернуться назад и попытаться снова прочитать, если s равно null.
Теги:
named-pipes

2 ответа

2
Лучший ответ

Измените код сервера следующим образом:

StreamWriter wr = new StreamWriter(p);
wr.WriteLine("Hello!\n");
wr.Flush();

ваша строка не сбрасывается в StreamWriter

  • 0
    Да, вам нужно очистить на самом высоком уровне (обычно следует избегать закрытия потока без предварительного закрытия всех пользователей этого потока). Но тогда я не думаю, что нужно дополнительное \n .
  • 0
    Вау, вот и все! Большое спасибо!!
3

Как сказал L.B, вы должны сбросить StreamWriter. Но использование шаблона using предотвратит такие ошибки:

using (var p = new NamedPipeServerStream("test3", PipeDirection.Out))
{
    p.WaitForConnection(); 
    Console.WriteLine("Connected!"); 
    using (var writer = new StreamWriter(p))
    {
         writer.WriteLine("Hello!");
         writer.Flush();
    }
    p.WaitForPipeDrain(); 
    p.Close();
}

В приведенном выше коде, даже если Flush() и Close() были опущены, все будет работать по назначению (так как эти операции также выполняются при размещении объекта). Кроме того, если какие-либо исключения будут выброшены, все будет по-прежнему тщательно очищено.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню