Я пытаюсь установить именованный канал (2 way) между python 2.7 и приложением C#. Он отлично работает для режима байтов, но когда я переключаюсь на режим сообщений на стороне сервера python, клиент C# утверждает, что он по-прежнему является байтовым режимом.Именованная труба между python 2.7 и C# с использованием режима сообщений
Вот мой питон код:
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();
}}
Для упрощения я только отправил передачу из питона на C#, потому что здесь здесь появляется ошибка. Клиент C# по какой-то причине считает, что передача - это Byte, поэтому возникает InvalidOperationException, говоря «ReadMode не является PipeTransmissionMode.Message.« Что я сделал неправильно.