Я реализую именованный канал дуплексной связи между python (сервер канала) и C # (клиент канала). Если сервер канала читает из канала, а затем пишет в него, а клиент канала делает это наоборот, это работает. Однако, когда я изменяю порядок так, что труба-сервер пишет, а затем читает, а труба-клиент делает это наоборот, программа зависает при чтении (ReadLine()
) без каких-либо ошибок или исключений. Я реализую обработку исключений, но здесь опускаю ее для лучшего обзора.
Следующий код работает правильно:
# Python 2 pipe server (ReadThenWrite)
pipe_handle = win32pipe.CreateNamedPipe(pipeName, win32pipe.PIPE_ACCESS_DUPLEX, ...)
win32pipe.ConnectNamedPipe(pipe_handle, None)
(_, read_message) = win32file.ReadFile(pipe_handle, 1000)
print('Received: ' + read_message)
win32file.WriteFile(pipe_handle, 'server')
win32file.FlushFileBuffers(pipe_handle)
win32pipe.DisconnectNamedPipe(pipe_handle)
win32file.CloseHandle(pipe_handle)
// C# pipe client (WriteThenRead)
NamedPipeClientStream pipeClient = NamedPipeClientStream(".", pipeName, PipeDirection.InOut)
pipeClient.Connect();
StreamWriter sw = new StreamWriter(pipeClient);
sw.AutoFlush = true;
sw.WriteLine("client");
StreamReader sr = new StreamReader(pipeClient);
string temp = sr.ReadLine();
Console.WriteLine("Received: " + temp);
В следующем коде только порядок чтенияи запись поменялась местами, и больше ничего не изменилось. Как ни странно, приложение C # зависает при чтении.
# Python 2 pipe server (WriteThenRead)
pipe_handle = win32pipe.CreateNamedPipe(pipeName, win32pipe.PIPE_ACCESS_DUPLEX, ...)
win32pipe.ConnectNamedPipe(pipe_handle, None)
win32file.WriteFile(pipe_handle, 'server')
(_, read_message) = win32file.ReadFile(pipe_handle, 1000)
print('Received: ' + read_message)
win32file.FlushFileBuffers(pipe_handle)
win32pipe.DisconnectNamedPipe(pipe_handle)
win32file.CloseHandle(pipe_handle)
// C# pipe client (ReadThenWrite)
NamedPipeClientStream pipeClient = NamedPipeClientStream(".", pipeName, PipeDirection.InOut)
pipeClient.Connect();
StreamReader sr = new StreamReader(pipeClient);
string temp = sr.ReadLine(); // here it hangs
Console.WriteLine("Received: " + temp);
StreamWriter sw = new StreamWriter(pipeClient);
sw.AutoFlush = true;
sw.WriteLine("client");
Если чтение канала удалено на канальном сервере (WriteThenRead), клиент канала не зависает и читает сообщение.
AsВ качестве обходного пути, сервер канала снова создает канал после записи (соответственно перед чтением), и клиент канала снова подключается к нему перед записью (соответственно после чтения). Но тогда он не используется как дуплексный канал.
Почему происходит такое поведение? Как это можно решить?
Любая помощь будет оценена, спасибо!