我需要一种方法让我的 Windows 服务与 Windows 客户端进行通信,为此我想使用 NamedPipes。所以我只是创建了一个非常简单的客户端/服务器场景,但我就是不明白为什么它不起作用。当我打电话时程序冻结了
writer.AutoFlush = true
。
服务器代码:
var server = new NamedPipeServerStream("MyPipe", PipeDirection.InOut, NamedPipeServerStream.MaxAllowedServerInstances, PipeTransmissionMode.Byte, PipeOptions.Asynchronous);
Console.WriteLine("Waiting for client connection...");
await server.WaitForConnectionAsync();
Console.WriteLine("Client connected.");
using var reader = new StreamReader(server, Encoding.UTF8);
await using var writer = new StreamWriter(server, Encoding.UTF8);
writer.AutoFlush = true;
while (true)
{
var message = await reader.ReadLineAsync();
Console.WriteLine($"Received: {message}");
await writer.WriteLineAsync($"Echo: {message}");
}
客户端代码:
await using var client = new NamedPipeClientStream(".", "MyPipe", PipeDirection.InOut, PipeOptions.Asynchronous);
Console.WriteLine("Connecting to server...");
await client.ConnectAsync();
Console.WriteLine("Connected to server.");
using var reader = new StreamReader(client, Encoding.UTF8);
Console.WriteLine("Reader initialized.");
await using var writer = new StreamWriter(client, Encoding.UTF8);
writer.AutoFlush = true;
Console.WriteLine("Writer initialized.");
await writer.WriteLineAsync("Hello, server!");
Console.WriteLine("Message sent.");
var response = await reader.ReadLineAsync();
Console.WriteLine($"Server response: {response}");
服务器输出:
Waiting for client connection...
Client connected.
客户端输出:
Connecting to server...
Connected to server.
Reader initialized.
有人能发现错误吗?
好吧,经过几个小时的反复试验,我现在终于知道了问题所在。似乎不允许您在流对象中指定编码(至少在服务器上)。所以我刚刚删除了
Encoding.UTF8
和 StreamReader
中的 StreamWriter
,现在它可以工作了!
最终服务器代码:
var server = new NamedPipeServerStream("MyPipe", PipeDirection.InOut, NamedPipeServerStream.MaxAllowedServerInstances, PipeTransmissionMode.Byte, PipeOptions.Asynchronous);
Console.WriteLine("Waiting for client connection...");
await server.WaitForConnectionAsync();
Console.WriteLine("Client connected.");
using var reader = new StreamReader(server);
await using var writer = new StreamWriter(server);
writer.AutoFlush = true;
while (true)
{
var message = await reader.ReadLineAsync();
Console.WriteLine($"Received: {message}");
await writer.WriteLineAsync($"Echo: {message}");
}