2017-02-22 31 views
1

Я пытаюсь установить именованный канал (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.« Что я сделал неправильно.

ответ

1

С именованными трубами как клиент, так и сервер должны индивидуально настроить режим чтения своей стороны трубы. Недостаточно просто установить одну сторону в режим сообщений. Добавьте эту строку ниже clientStream.Connect(); в свой C#.

clientStream.ReadMode = PipeTransmissionMode.Message; 

Для получения дополнительной информации см следующее:

 Смежные вопросы

  • Нет связанных вопросов^_^