Я пытаюсь научиться делать Именованные каналы. Поэтому я создал сервер и клиент в 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:
без ничего после него, поэтому данные фактически не переходят с сервера на клиент для отображения. Я уже пробовал перекодировать направления трубопроводов и отправить клиенту данные на сервер с тем же результатом.
Почему в этом примере не распечатываются данные на экране? Что мне не хватает?
Спасибо!
Измените код сервера следующим образом:
StreamWriter wr = new StreamWriter(p);
wr.WriteLine("Hello!\n");
wr.Flush();
ваша строка не сбрасывается в StreamWriter
\n
.
Как сказал 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()
были опущены, все будет работать по назначению (так как эти операции также выполняются при размещении объекта). Кроме того, если какие-либо исключения будут выброшены, все будет по-прежнему тщательно очищено.