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管道通信的主要内容,如果未能解决你的问题,请参考以下文章

进程通信-无名管道

Qt笔记-Windows管道通信

进程通信方式-管道pipe

进程间通信

Windows 中的 python 2 和 python 3 之间的命名管道的工作方式有啥不同吗?

linux命令管道工作原理与使用方法