命名管道 C# 服务器 + Python 客户端

Named Pipe C# Server + Python Client

我正在尝试使用 Python 客户端创建 C# 命名管道服务器。 Python 客户端应该向 C# 服务器发送一条指令,服务器 return 根据指令发送一些数据。 C# 服务器将一直 运行 等待来自 Python 的指令。基本上像 web API 服务器。但是只使用命名管道而不是 http。

到目前为止,我已经能够通过修改我在 Whosebug 上找到的一些示例将下面的代码放在一起。但是,它根本不起作用。从 Python 到 C# 的消息从未收到,尽管已建立连接。我什至不确定是否可以从 Python 发送消息。我不确定我做错了什么。任何帮助将不胜感激。

C# 服务器

public class Server
    {
        private NamedPipeServerStream PipeServer { get; set; }

        public void StartServer()
        {
            NamedPipeServerStream pipeServer = new NamedPipeServerStream("TestServer", PipeDirection.InOut, 10, PipeTransmissionMode.Message, PipeOptions.WriteThrough, 1024, 1024);

            StreamReader sr = new StreamReader(pipeServer);
            StreamWriter sw = new StreamWriter(pipeServer);

            do
            {
                try
                {
                    pipeServer.WaitForConnection();
                    string instruction;

                    //Receive instruction message
                    instruction = sr.ReadLine();
                    Console.WriteLine(instruction);

                    //Do some database calls

                    //Send data back to Python client
                    sw.WriteLine("Data");
                    sw.Flush();
                    pipeServer.WaitForPipeDrain();
                }
                catch (Exception ex) { throw ex; }
                finally
                {
                    pipeServer.WaitForPipeDrain();
                    if (pipeServer.IsConnected) { pipeServer.Disconnect(); }
                }
            } while (true);
        }
    }

Python 客户端

import time
import sys
import win32pipe, win32file, pywintypes

def PipeClient():
    print("pipe client")
    quit = False

    while not quit:
        try:
            handle = win32file.CreateFile(
                r'\.\pipe\TestServer',
                win32file.GENERIC_READ | win32file.GENERIC_WRITE,
                0,
                None,
                win32file.OPEN_EXISTING,
                0,
                None
            )
            res = win32pipe.SetNamedPipeHandleState(handle, win32pipe.PIPE_READMODE_MESSAGE, None, None)
            if res == 0:
                print(f"SetNamedPipeHandleState return code: {res}")
            while True:

                # Send instruction data to c# server
                win32file.WriteFile(handle, str.encode('Instruction 1'))

                # Receive data from Python client
                resp = win32file.ReadFile(handle, 64*1024)
                print(f"message: {resp}")
          
        
        except pywintypes.error as e:
            if e.args[0] == 2:
                print("no pipe, trying again in a sec")
                time.sleep(1)
            elif e.args[0] == 109:
                print("broken pipe, bye bye")
                quit = True


t = PipeClient()

您在 C# 代码中执行 ReadLine,但您从未在 Python 代码中编写换行符 ('\n'),因此永远不会看到完整的线.