Python笔记-windows管道通信
Posted IT1995
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python笔记-windows管道通信相关的知识,希望对你有一定的参考价值。
这里主要是两个进程中共享数据,本质是共享内存。采用I/O流的方式来访问。
有两种管道:
①匿名管道:父子进程间通信;
②命名管道:两个进程间通信。
Python代码如下:
server.py
# -*- coding: utf-8 -*-
import win32file
import win32pipe
PIPE_NAME = r"\\\\.\\pipe\\test_pip"
PIPE_BUFFER_SIZE = 65535
# PIPE_ACCESS_DUPLEX 双向通信
namedPipe = win32pipe.CreateNamedPipe(PIPE_NAME,
win32pipe.PIPE_ACCESS_DUPLEX,
win32pipe.PIPE_TYPE_MESSAGE | win32pipe.PIPE_WAIT | win32pipe.PIPE_READMODE_MESSAGE,
win32pipe.PIPE_UNLIMITED_INSTANCES,
PIPE_BUFFER_SIZE,
PIPE_BUFFER_SIZE, 500, None)
if __name__ == '__main__':
while True:
try:
win32pipe.ConnectNamedPipe(namedPipe, None)
data = win32file.ReadFile(namedPipe, PIPE_BUFFER_SIZE, None)
if data is None or len(data) < 2:
continue
print("receive msg : ", str(data))
pass
except Exception as e:
print(e)
pass
try:
win32pipe.DisconnectNamedPipe(namedPipe)
pass
except Exception as e:
print(e)
pass
pass
client.py
# -*- coding: utf-8 -*-
import win32pipe
import win32file
import time
PIPE_NAME = r"\\\\.\\pipe\\test_pip"
fileHandle = win32file.CreateFile(PIPE_NAME,
win32file.GENERIC_READ | win32file.GENERIC_WRITE,
win32file.FILE_SHARE_WRITE, None,
win32file.OPEN_EXISTING, 0, None)
if __name__ == '__main__':
try:
for i in range(1, 100):
msg = str(i)
print("send msg: " + msg)
win32file.WriteFile(fileHandle, msg.encode())
time.sleep(1)
pass
pass
except Exception as e:
print(e)
pass
finally:
try:
win32file.CloseHandle(fileHandle)
pass
except Exception as e:
print(e)
pass
pass
pass
程序运行截图如下:
客户端:
服务端:
需要注意的地方:
# PIPE_ACCESS_DUPLEX 该管道是双向的,服务器和客户端进程都可以从管道读取或者向管道写入数据。
# PIPE_ACCESS_INBOUND 该管道中数据是从客户端流向服务端,即客户端只能写,服务端只能读。
# PIPE_ACCESS_OUTBOUND 该管道中数据是从服务端流向客户端,即客户端只能读,服务端只能写。
# PIPE_TYPE_BYTE 数据作为一个连续的字节数据流写入管道。
# PIPE_TYPE_MESSAGE 数据用数据块(名为“消息”或“报文”)的形式写入管道。
# PIPE_READMODE_BYTE 数据以单独字节的形式从管道中读出。
# PIPE_READMODE_MESSAGE 数据以名为“消息”的数据块形式从管道中读出(要求指定PIPE_TYPE_MESSAGE)。
# PIPE_WAIT 同步操作在等待的时候挂起线程。
# PIPE_NOWAIT 同步操作立即返回。
以上是关于Python笔记-windows管道通信的主要内容,如果未能解决你的问题,请参考以下文章