您的位置:首页 > 编程语言 > Python开发

如何使用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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: