python 2.7 和 c# 使用消息模式之间的命名管道
named pipe between python 2.7 and c# using Message Mode
我正在尝试在 python 2.7 和 C# 应用程序之间建立命名管道(两种方式)。它适用于字节模式,但是当我在 python 服务器端更改为消息模式时,C# 客户端声称它仍然是字节模式。
这是我的python代码:
import win32pipe, win32file
p = win32pipe.CreateNamedPipe("\\.\pipe\test_pipe",
win32pipe.PIPE_ACCESS_DUPLEX,
win32pipe.PIPE_TYPE_MESSAGE|win32pipe.PIPE_READMODE_MESSAGE | win32pipe.PIPE_WAIT,
1, 65536, 65536,300,None)
print("Waiting for connection");
win32pipe.ConnectNamedPipe(p, None)
print("Client has connected")
win32file.WriteFile(p, "TestMessage".encode('utf-8'))
p.close()
我的C#-代码:
class Program
{
static void Main(string[] args)
{
using (NamedPipeClientStream clientStream = new NamedPipeClientStream(".", "test_pipe", PipeDirection.InOut))
{
clientStream.Connect();
Console.WriteLine("Connected");
string inMessage = ProcessSingleReceivedMessage(clientStream);
Console.WriteLine("in Message " + inMessage);
}
Console.ReadLine();
}
private static string ProcessSingleReceivedMessage(NamedPipeClientStream namedPipeClient)
{
Console.WriteLine("Transmission mode: " + namedPipeClient.TransmissionMode);
StringBuilder messageBuilder = new StringBuilder();
string messageChunk = string.Empty;
byte[] messageBuffer = new byte[5];
do
{
namedPipeClient.Read(messageBuffer, 0, messageBuffer.Length);
messageChunk = Encoding.UTF8.GetString(messageBuffer);
messageBuilder.Append(messageChunk);
messageBuffer = new byte[messageBuffer.Length];
}
while (!namedPipeClient.IsMessageComplete);
return messageBuilder.ToString();
}}
为了简单起见,我只贴出了从python到C#的传输,因为这里出现了错误。由于某种原因,c# 客户端认为传输是字节,因此出现 InvalidOperationException 说“ReadMode 不是 PipeTransmissionMode.Message。”我做错了什么。
对于命名管道,客户端和服务器都必须单独设置管道端的读取模式。仅仅将一侧设置为消息模式是不够的。在您的 C# 中的 clientStream.Connect();
下面添加此行。
clientStream.ReadMode = PipeTransmissionMode.Message;
有关详细信息,请参阅以下内容:
- PipeStream.IsMessageComplete
- PipeStream.ReadMode
- 命名管道文档的
Read Mode
部分。
我正在尝试在 python 2.7 和 C# 应用程序之间建立命名管道(两种方式)。它适用于字节模式,但是当我在 python 服务器端更改为消息模式时,C# 客户端声称它仍然是字节模式。
这是我的python代码:
import win32pipe, win32file
p = win32pipe.CreateNamedPipe("\\.\pipe\test_pipe",
win32pipe.PIPE_ACCESS_DUPLEX,
win32pipe.PIPE_TYPE_MESSAGE|win32pipe.PIPE_READMODE_MESSAGE | win32pipe.PIPE_WAIT,
1, 65536, 65536,300,None)
print("Waiting for connection");
win32pipe.ConnectNamedPipe(p, None)
print("Client has connected")
win32file.WriteFile(p, "TestMessage".encode('utf-8'))
p.close()
我的C#-代码:
class Program
{
static void Main(string[] args)
{
using (NamedPipeClientStream clientStream = new NamedPipeClientStream(".", "test_pipe", PipeDirection.InOut))
{
clientStream.Connect();
Console.WriteLine("Connected");
string inMessage = ProcessSingleReceivedMessage(clientStream);
Console.WriteLine("in Message " + inMessage);
}
Console.ReadLine();
}
private static string ProcessSingleReceivedMessage(NamedPipeClientStream namedPipeClient)
{
Console.WriteLine("Transmission mode: " + namedPipeClient.TransmissionMode);
StringBuilder messageBuilder = new StringBuilder();
string messageChunk = string.Empty;
byte[] messageBuffer = new byte[5];
do
{
namedPipeClient.Read(messageBuffer, 0, messageBuffer.Length);
messageChunk = Encoding.UTF8.GetString(messageBuffer);
messageBuilder.Append(messageChunk);
messageBuffer = new byte[messageBuffer.Length];
}
while (!namedPipeClient.IsMessageComplete);
return messageBuilder.ToString();
}}
为了简单起见,我只贴出了从python到C#的传输,因为这里出现了错误。由于某种原因,c# 客户端认为传输是字节,因此出现 InvalidOperationException 说“ReadMode 不是 PipeTransmissionMode.Message。”我做错了什么。
对于命名管道,客户端和服务器都必须单独设置管道端的读取模式。仅仅将一侧设置为消息模式是不够的。在您的 C# 中的 clientStream.Connect();
下面添加此行。
clientStream.ReadMode = PipeTransmissionMode.Message;
有关详细信息,请参阅以下内容:
- PipeStream.IsMessageComplete
- PipeStream.ReadMode
- 命名管道文档的
Read Mode
部分。