如何使用Python实现进程间通信
2015-03-19 23:01
435 查看
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-8 import socket import sys import os import traceback server_address = './uds_socket' # 每次启动时,确定server_address路径不存在 try: os.unlink(server_address) except OSError: if os.path.exists(server_address): raise # 创建一个UDS socket sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) # 绑定地址 print 'starting up on %s' % server_address sock.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 socket import sys sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) server_address = './uds_socket' print 'connecting to %s' % server_address try: 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"' %data finally: print 'closing socket' sock.close()
python server.py starting up on ./uds_socket waiting for a connection connection from received "Hello socket uds." sending data back to the client received "" no more data from python client.py connecting to ./uds_socket sending "Hello socket uds." received "Hello socket uds." closing socket
相关文章推荐
- 使用Python的Queue实现线程/进程间通信
- 使用PYTHON实现如何修改文本文件中的内容
- 如何使用Python和Nose实现自动化测试?
- 使用 Python 和 Oracle 数据库实现高并发性 了解如何借助线程和并发性提升支持 Oracle 数据库的 Python 应用程序的吞吐量和响应性。
- 如何使用Python调用AutoIt来实现Flash控件的上传功能
- 使用Anaconda如何实现Python多环境配置?
- python_如何使用生成器实现可迭代对象?
- 使用python如何实现森另算法?
- 如何在Windows下实现Python2和python3共存同时使用
- 学python(03)—— 如何使用函数实现一个随机字符串里的大小写字符互换
- 如何使用 Python 实现自动化测试
- 如何使用Python的Requests包实现模拟登陆
- python如何使用生成器函数实现可迭代对象
- Python进程间通信,使用multiprocessing.connection的Listener和Client实现
- 使用greenlet如何实现Python中的并发?
- python 7-6 如何使用描述符对实例属性做类型检查,分别实现set,方法,在set内使用isinstance做类型检查
- 写python使用IDLE如何实现调试功能
- 使用python如何实现Windows定时关机?
- python-7-如何使用生成器函数实现可迭代对象?
- 如何使用纯js实现一个带有灰色半透明背景的弹出框