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

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-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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值