如何使用Python实现进程间通信
来源:互联网 发布:平野绫事件 知乎 编辑:程序博客网 时间:2024/05/17 04:03
socket是什么?
在网络通讯中,socket是数据传输通道的节点,控制着数据的传输与接收。socket依靠两个主要的属性控制数据的传输与接收:地址族(address families)与连接类型(socket type)。
address families?
address families控制着OSI网络层协议的使用,在python中有三种address families。
- AF_INET,也就是最普遍的IPv4网络地址,长度为32位,以点分十进制表示。
- AF_INET6,IPv6,下一代网络协议,128位地址。
- AF_UNIX, 一种进程间通信协议,使用在POSIX-compliant的系统上。
AF_UNIX是在Unix Domain Sockets(UDS)上使用的地址族,UDS的与众不同之处在于它允许操作系统在进程之间直接传递数据。这比AF_INET要有效率的多。
socket type?
socket type控制着OSI传输层协议的使用。
- SOCK_STREAM,TCP协议。
- SOCK_DGRAM,UDP协议。
TCP连接需要client与server完成三次握手来确保连接的可靠性,这样就能传输有序且准确的数据,耗费的资源较多。而UDP实现了一种不可靠的数据传输,通常会用来传输一些不重要的信息,如DNS或广播。
示例:建立一个TCP/IP连接
socket(socket.AF_INET, socket.SOCK_STREAM) -> socket object
如何实现进程间通信
回到主题,进程间的通信与TCP/IP通信有两点不同。
- 地址不再是一个包含IP和端口的元组,而是文件系统上的一个路径。
- socket关闭后,不会删除bind的文件路径,需要每次启动服务时检查并删除。
以下是代码实现:
####### server.py ######## encoding: utf-8import socketimport sysimport osimport tracebackserver_address = './uds_socket'# 每次启动时,确定server_address路径不存在try: os.unlink(server_address)except OSError: if os.path.exists(server_address): raise# 创建一个UDS socketsock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)# 绑定地址print 'starting up on %s' % server_addresssock.bind(server_address)# 监听连接数sock.listen(1)while True: # 等待连接 print 'waiting for a connection' connection, client_address = sock.accept() try: print 'connection from', client_address # 接收数据并返回给客户端 while True: data = connection.recv(128) print 'received "%s"' % data if data: print 'sending data back to the client' connection.sendall(data) else: print 'no more data from', client_address break except Exception, e: traceback.format_exc() finally: # 关闭连接 connection.close()
##########client.py#######import socketimport syssock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)server_address = './uds_socket'print 'connecting to %s' % server_addresstry: sock.connect(server_address)except socket.error, msg: print msg sys.exit(1)try: message = 'Hello socket uds.' print 'sending "%s"' %message sock.sendall(message) data = sock.recv(128) print 'received "%s"' %datafinally: print 'closing socket' sock.close()
python server.pystarting up on ./uds_socketwaiting for a connectionconnection from received "Hello socket uds."sending data back to the clientreceived ""no more data from python client.pyconnecting to ./uds_socketsending "Hello socket uds."received "Hello socket uds."closing socket
0 0
- 如何使用Python实现进程间通信
- 进程间通信如何实现
- 使用Python的Queue实现线程/进程间通信
- Python socket 实现进程间通信
- 如何实现进程间的通信
- 如何实现进程间的通信
- windows下进程间如何实现通信
- 如何实现进程间的通信
- 如何实现进程间的通信
- 进程间的通信如何实现
- java如何实现进程间的通信?
- Python使用Socket 进行进程间通信
- 使用命名管道实现进程间通信
- 使用命名管道实现进程间通信
- 使用命名管道实现进程间通信
- 使用AIDL实现进程间的通信
- 使用管道实现进程间的通信
- 使用消息实现进程间通信
- FileZilla Server设置虚拟目录
- char*,string,CString,int,char[]之间的转换
- spring注解事务
- 常见的23种设计模式,你知道多少?
- 黑马程序员--c语言-排序
- 如何使用Python实现进程间通信
- css实现多行文本溢出显示省略号(…)全攻略
- Bootstrap-栅格系统
- 存一个数位dp的模板
- NYOJ305 表达式求值(递归or栈)
- python学习(一):画幅好画
- php使用pdo或mysqli查询
- 《Redis设计与实现》学习笔记-持久化机制
- 【黑马程序员】iOS学习之路——Objective-C之特有语法