如何使用Python实现进程间通信

来源:互联网 发布:平野绫事件 知乎 编辑:程序博客网 时间:2024/05/17 04:03

socket是什么?

在网络通讯中,socket是数据传输通道的节点,控制着数据的传输与接收。socket依靠两个主要的属性控制数据的传输与接收:地址族(address families)连接类型(socket type)


address families?

address families控制着OSI网络层协议的使用,在python中有三种address families。

  1. AF_INET,也就是最普遍的IPv4网络地址,长度为32位,以点分十进制表示。
  2. AF_INET6,IPv6,下一代网络协议,128位地址。
  3. AF_UNIX, 一种进程间通信协议,使用在POSIX-compliant的系统上。

AF_UNIX是在Unix Domain Sockets(UDS)上使用的地址族,UDS的与众不同之处在于它允许操作系统在进程之间直接传递数据。这比AF_INET要有效率的多。


socket type?

socket type控制着OSI传输层协议的使用。

  1. SOCK_STREAM,TCP协议。
  2. SOCK_DGRAM,UDP协议。

TCP连接需要client与server完成三次握手来确保连接的可靠性,这样就能传输有序且准确的数据,耗费的资源较多。而UDP实现了一种不可靠的数据传输,通常会用来传输一些不重要的信息,如DNS或广播。


示例:建立一个TCP/IP连接

socket(socket.AF_INET, socket.SOCK_STREAM) -> socket object

如何实现进程间通信

回到主题,进程间的通信与TCP/IP通信有两点不同。

  1. 地址不再是一个包含IP和端口的元组,而是文件系统上的一个路径。
  2. 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
原创粉丝点击