在c#中使用命名管道的两个进程之间的双工操作
本文关键字:两个 进程 之间 操作 管道 | 更新日期: 2023-09-27 17:58:52
我正在尝试使用命名管道在同一台机器上的服务器和客户端进程之间进行通信。服务器向客户端发送一条消息,客户端用它做一些事情并返回一个结果,服务器应该得到结果。
这是服务器的代码:
using System;
using System.IO;
using System.IO.Pipes;
class PipeServer
{
static void Main()
{
using (NamedPipeServerStream pipeServer =
new NamedPipeServerStream("testpipe", PipeDirection.InOut))
{
Console.WriteLine("NamedPipeServerStream object created.");
// Wait for a client to connect
Console.Write("Waiting for client connection...");
pipeServer.WaitForConnection();
Console.WriteLine("Client connected.");
try
{
// Read user input and send that to the client process.
using (StreamWriter sw = new StreamWriter(pipeServer))
{
sw.AutoFlush = true;
Console.Write("Enter text: ");
sw.WriteLine(Console.ReadLine());
}
pipeServer.WaitForPipeDrain();
using (StreamReader sr = new StreamReader(pipeServer))
{
// Display the read text to the console
string temp;
// Wait for result from the client.
while ((temp = sr.ReadLine()) != null)
{
Console.WriteLine("[CLIENT] Echo: " + temp);
}
}
}
// Catch the IOException that is raised if the pipe is
// broken or disconnected.
catch (IOException e)
{
Console.WriteLine("ERROR: {0}", e.Message);
}
}
}
}
这是客户端的代码:
using System;
using System.IO;
using System.IO.Pipes;
class PipeClient
{
static void Main(string[] args)
{
using (NamedPipeClientStream pipeClient =
new NamedPipeClientStream(".", "testpipe", PipeDirection.InOut))
{
// Connect to the pipe or wait until the pipe is available.
Console.Write("Attempting to connect to pipe...");
pipeClient.Connect();
Console.WriteLine("Connected to pipe.");
Console.WriteLine("There are currently {0} pipe server instances open.",
pipeClient.NumberOfServerInstances);
using (StreamReader sr = new StreamReader(pipeClient))
{
// Display the read text to the console
string temp;
while ((temp = sr.ReadLine()) != null)
{
Console.WriteLine("Received from server: {0}", temp);
}
}
// send the "result" back to the Parent process.
using (StreamWriter sw = new StreamWriter(pipeClient))
{
sw.AutoFlush = true;
sw.WriteLine("Result");
}
pipeClient.WaitForPipeDrain();
}
Console.Write("Press Enter to continue...");
Console.ReadLine();
}
}
但在服务器代码中,在pipeServer.WWaitForPipeDrain()行;我得到一个ObjectDisposedException,它说"无法访问一个封闭的管道。"
在设置sw时,我在客户端代码中也遇到了同样的错误。自动刷新为true。
基本上,我在c#中找不到双工命名管道的例子。我要么需要它,要么需要一个匿名管道的例子,有两个管道——一个用于阅读,一个用于在父母和孩子之间书写。
提前感谢。
问题是StreamWriter
的使用块,它将关闭底层Stream(这里是您的管道)。如果你不使用那个块,它应该可以工作。
您可以执行以下操作:
using (var pipeServer = new NamedPipeServerStream("testpipe", PipeDirection.InOut))
using (var streamReader = new StreamReader(pipeServer))
using (var streamWriter = new StreamWriter(pipeServer))
{
// ... Your code ..
}
正如Johannes Egger所指出的,StreamWriter
在Dispose()
上刷新流,因此StreamWriter
应该首先被处理,因此是最内部的要处理对象。