为什么这个简单的异步 NamedPipe 连接不起作用?

问题描述 投票:0回答:1

我需要一种方法让我的 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.

有人能发现错误吗?

c# .net named-pipes
1个回答
0
投票

好吧,经过几个小时的反复试验,我现在终于知道了问题所在。似乎不允许您在流对象中指定编码(至少在服务器上)。所以我刚刚删除了

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}");
}

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.