2017-02-22 88 views
1

我试图建立一个命名管道(2方式)之间的Python 2.7和C#应用程序。它适用于字节模式,但是当我在python服务器端更改消息模式时,C#客户端声称它仍然是字节模式。命名管道之间的Python 2.7和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#-Code

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#客户端认为传输是Byte,因此发生InvalidOperationException异常,说“ReadMode不是PipeTransmissionMode.Message。”我做错了什么。

回答

1

使用命名管道,客户端和服务器都必须单独设置管道侧面的读取模式。简单地将一侧设置为消息模式是不够的。在你的C#中,在clientStream.Connect();下面添加这行。

clientStream.ReadMode = PipeTransmissionMode.Message; 

欲了解更多信息,请参阅以下内容: