关键词搜索

源码搜索 ×
×

Python笔记-windows管道通信

发布2022-04-18浏览1559次

详情内容

这里主要是两个进程中共享数据,本质是共享内存。采用I/O流的方式来访问。

有两种管道:

①匿名管道:父子进程间通信

②命名管道:两个进程间通信。

Python代码如下:

 server.py

  1. # -*- coding: utf-8 -*-
  2. import win32file
  3. import win32pipe
  4. PIPE_NAME = r"\\.\pipe\test_pip"
  5. PIPE_BUFFER_SIZE = 65535
  6. # PIPE_ACCESS_DUPLEX 双向通信
  7. namedPipe = win32pipe.CreateNamedPipe(PIPE_NAME,
  8. win32pipe.PIPE_ACCESS_DUPLEX,
  9. win32pipe.PIPE_TYPE_MESSAGE | win32pipe.PIPE_WAIT | win32pipe.PIPE_READMODE_MESSAGE,
  10. win32pipe.PIPE_UNLIMITED_INSTANCES,
  11. PIPE_BUFFER_SIZE,
  12. PIPE_BUFFER_SIZE, 500, None)
  13. if __name__ == '__main__':
  14. while True:
  15. try:
  16. win32pipe.ConnectNamedPipe(namedPipe, None)
  17. data = win32file.ReadFile(namedPipe, PIPE_BUFFER_SIZE, None)
  18. if data is None or len(data) < 2:
  19. continue
  20. print("receive msg : ", str(data))
  21. pass
  22. except Exception as e:
  23. print(e)
  24. pass
  25. try:
  26. win32pipe.DisconnectNamedPipe(namedPipe)
  27. pass
  28. except Exception as e:
  29. print(e)
  30. pass
  31. pass

client.py

  1. # -*- coding: utf-8 -*-
  2. import win32pipe
  3. import win32file
  4. import time
  5. PIPE_NAME = r"\\.\pipe\test_pip"
  6. fileHandle = win32file.CreateFile(PIPE_NAME,
  7. win32file.GENERIC_READ | win32file.GENERIC_WRITE,
  8. win32file.FILE_SHARE_WRITE, None,
  9. win32file.OPEN_EXISTING, 0, None)
  10. if __name__ == '__main__':
  11. try:
  12. for i in range(1, 100):
  13. msg = str(i)
  14. print("send msg: " + msg)
  15. win32file.WriteFile(fileHandle, msg.encode())
  16. time.sleep(1)
  17. pass
  18. pass
  19. except Exception as e:
  20. print(e)
  21. pass
  22. finally:
  23. try:
  24. win32file.CloseHandle(fileHandle)
  25. pass
  26. except Exception as e:
  27. print(e)
  28. pass
  29. pass
  30. pass

程序运行截图如下:

客户端:

 服务端:

 需要注意的地方:

  1. # PIPE_ACCESS_DUPLEX 该管道是双向的,服务器和客户端进程都可以从管道读取或者向管道写入数据。
  2. # PIPE_ACCESS_INBOUND 该管道中数据是从客户端流向服务端,即客户端只能写,服务端只能读。
  3. # PIPE_ACCESS_OUTBOUND 该管道中数据是从服务端流向客户端,即客户端只能读,服务端只能写。
  4. # PIPE_TYPE_BYTE 数据作为一个连续的字节数据流写入管道。
  5. # PIPE_TYPE_MESSAGE 数据用数据块(名为“消息”或“报文”)的形式写入管道。
  6. # PIPE_READMODE_BYTE 数据以单独字节的形式从管道中读出。
  7. # PIPE_READMODE_MESSAGE 数据以名为“消息”的数据块形式从管道中读出(要求指定PIPE_TYPE_MESSAGE)。
  8. # PIPE_WAIT 同步操作在等待的时候挂起线程。
  9. # PIPE_NOWAIT 同步操作立即返回。

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载