【发布时间】:2015-10-13 16:57:29
【问题描述】:
这是take II,我前一周发的my question被搁置了,我调整了我的文字但无法获得评论,系统关闭了原帖。
逻辑
服务器端:只读 - 服务器打开管道,然后定期检查是否有内容(即不在流的末尾)并读取信息。此检查必须基于轮询,因为只有在轮询期间才会有有效的上下文来传递数据。
客户端:只写 - 打开管道,写入管道,关闭(client.exe调用多次,寿命短,下面的代码是测试代码),例如其他一些脚本将“使用信息调用 client.exe”
可以在管道中处理此工作流程吗?例如客户端代码的 sn -p 仅显示“服务器”看到的第一条客户端消息
如果管道可以在编码提示后执行此操作,因为大多数示例都是针对具有相似生命周期的客户端 - 服务器。
代码 sn-ps
for (int i = 0; i < 10; i++)
{
//Client - simulate exe starting and ending
var client = new NamedPipeClientStream(".", "PipesOfPiece", PipeDirection.Out, PipeOptions.WriteThrough);
client.Connect();
StreamWriter writer = new StreamWriter(client);
Console.WriteLine("Client about to send message");
writer.WriteLine("Called from client i = {0}", i);
writer.Close();
client.Close();
Thread.Sleep(5000);
}
// server snippet
var server = new NamedPipeServerStream("PipesOfPiece", PipeDirection.In);
server.WaitForConnection(); <= can this we optional with code below
StreamReader reader = new StreamReader(server);
while (true)
{
// simulate start of poll code
if (server.IsConnected)
{
if (!reader.EndOfStream)
{
var line = reader.ReadToEnd();
Console.WriteLine("Server: {0}", line);
}
} // End of poll code
Thread.Sleep(1000);
}
// server snippet
var server = new NamedPipeServerStream("PipesOfPiece", PipeDirection.In);
server.WaitForConnection(); <= can this we optional with code below
StreamReader reader = new StreamReader(server);
while (true)
{
// simulate start of poll code
if (server.IsConnected)
{
if (!reader.EndOfStream)
{
var line = reader.ReadToEnd();
Console.WriteLine("Server: {0}", line);
}
} // End of poll code
Thread.Sleep(1000);
}
所以我的管道生锈了,我希望管道可以打开,写入然后读取,并且 waitforconnect() 用于您想要的情况并且是可选的。我想这一切都围绕谁拥有管道触发,即如果服务器打开管道并等待有人为它写,为什么它需要等待连接? (我希望服务器是所有者,所以当它结束时,管道消失)
【问题讨论】:
-
不确定你不明白什么。客户端可以打开管道并写入吗?是的。服务器可以打开管道并读取它吗?是的。 doco 会告诉你的。
-
上面的代码只适用于第一个客户端。记录在案的代码没有涵盖我的上下文。所以也许你可以按用例告诉我 doco 在封面的哪个位置?
-
"only works for the first client pass" - 你的意思是你的代码只适用于 first client 并且后续客户端失败?代码的哪一部分失败了?你是在调试器中运行的吗?
-
我想避免代码中的细节,以防我走错了路。我想用代码来表示类似我的用例。那么我可以请任何人评论管道功能是否允许服务器打开一次并打开和关闭多个客户端?
-
没问题。是的,Windows 中的命名管道允许多个客户端使用唯一的管道实例写入同一个逻辑管道(或 管道名称),以便可以同时使用管道。见msdn.microsoft.com/en-us/library/windows/desktop/… 和*.com/questions/1266849/…
标签: c# named-pipes