命名管道 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'
),因此永远不会看到完整的线.
我正在尝试使用 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'
),因此永远不会看到完整的线.