C# 命名管道服务器&;客户端-无消息
我正在努力学习如何使用命名管道。所以我在LinqPad中创建了一个服务器和客户端 这是我的服务器:C# 命名管道服务器&;客户端-无消息,c#,named-pipes,C#,Named Pipes,我正在努力学习如何使用命名管道。所以我在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 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();
我先运行服务器,然后运行客户机,我看到服务器上显示“已连接!”,这样它就可以正常连接了。但是,客户端总是显示消息:
,后面什么也没有,因此数据实际上不是从服务器传输到要显示的客户端。我已经尝试过交换管道方向,并让客户端向服务器发送数据,结果相同
在本例中,为什么不在屏幕上打印数据?我错过了什么
谢谢 按如下方式更改服务器代码:
StreamWriter wr = new StreamWriter(p);
wr.WriteLine("Hello!\n");
wr.Flush();
您的字符串不会在StreamWriter中刷新,正如L.B所说,您必须刷新
StreamWriter
。但是使用模式使用可以防止此类错误:
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()
,所有操作都会按预期工作(因为这些操作也是在处理对象时执行的)。此外,如果抛出任何异常,所有内容仍将被正确清理。根据StreamReader.ReadLine文档,如果到达流结束,它将返回null。可能是在执行ReadLine时,管道中没有数据,流为空。如果s为null,您可能希望循环并再次尝试读取。是的,您需要在最高级别刷新(通常应避免在不首先关闭该流的所有用户的情况下关闭该流)。但是我认为不需要额外的\n
。哇哦,就是这样!非常感谢你!!它看起来像p.WaitForPipeDrain();属于一行:使用块进入streamwriter。否则,使用块将关闭管道,并导致System.ObjectDisposedException Message=无法访问关闭的管道。