15. 进程间通讯与网络库
本库主要提供了不同进程之间通讯,以及不同网络之间的进程通讯。
本模块提供了BSD类似的socket网络接口库,它可以使用在Unix、Windows、MacOS等系统平台上。
exception socket.herror
地址相关错误的异常。
exception socket.gaierror
调用函数getaddrinfo()或getnameinfo()出错抛出异常。
exception socket.timeout
当一个socket超时抛出的异常。
socket.AF_UNIX
socket.AF_INET
socket.AF_INET6
表示网络地址类型。
socket.SOCK_STREAM
socket.SOCK_DGRAM
socket.SOCK_RAW
socket.SOCK_RDM
socket.SOCK_SEQPACKET
socket的类型。
socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)
创建一个socket实例。参数family是socket地址类型;参数type是TCP还是UDP等类型;参数proto是协议版本号。
socket.socketpair([family[, type[, proto]]])
创建一对相互通讯的socket对象,仅用于Unix。
socket.create_connection(address[, timeout[, source_address]])
创建一个连接到指定服务器的socket对象。参数address是(主机, 端口)元组;参数timeout是连接超时时间;参数source_address是指定绑定的客户端的地址和端口。
socket.fromfd(fd, family, type, proto=0)
从一个文件描述fd来创建一个socket对象。
socket.fromshare(data)
从指定的数据data里创建一个socket对象,仅用于Windows。
socket.SocketType
Python表示socket的类型。
socket.getaddrinfo(host, port, family=0, type=0, proto=0, flags=0)
通过名称获取地址信息,返回5个元组(family, type, proto, canonname, sockaddr)的地址信息,可以用于连接服务器。
socket.getfqdn([name])
查询给出名称的域名称。
socket.gethostbyname(hostname)
把主机名称转换为IPv4地址格式。
socket.gethostbyname_ex(hostname)
使用扩展的方式把主机名称转换为IPv4地址格式。
socket.gethostname()
返回字符串表示的主机名称。
socket.gethostbyaddr(ip_address)
通过地址来获取主机名称,返回三元组的信息。
socket.getnameinfo(sockaddr, flags)
把socket地址转换为两元素的元组(主机,端口)。
socket.getprotobyname(protocolname)
通过协议名称来获取合适参数给socket()函数使用。
socket.getservbyname(servicename[, protocolname])
从服务名称和协议名称转换为合适的端口。
socket.getservbyport(port[, protocolname])
从端口转换为服务名称。
socket.ntohl(x)
转换32位网络顺序数据到主机顺序。
socket.ntohs(x)
转换16位网络顺序数据到主机顺序。
socket.htonl(x)
转换32位主机顺序数据到网络顺序。
socket.htons(x)
转换16位主机顺序数据到网络顺序。
socket.inet_aton(ip_string)
把字符串表示的IP地址转换为32位二进制表示。
socket.inet_ntoa(packed_ip)
把32位表示的IPv4地址转换为字符串表示的IP地址。
socket.inet_pton(address_family, ip_string)
从特定网络字符串表示的地址转换为二进制表示的地址。
socket.inet_ntop(address_family, packed_ip)
从特定网络二进制表示的地址转换为字符串表示的地址。
socket.CMSG_LEN(length)
返回总数据的长度。仅用于Unix。
socket.CMSG_SPACE(length)
返回recvmsg()函数接收数据缓冲区的大小。仅用Unix。
socket.getdefaulttimeout()
返回本模块默认的超时时间。
socket.setdefaulttimeout(timeout)
设置本模块的超时时间。
socket.sethostname(name)
设置主机的名称。仅用于Unix。
socket.if_nameindex()
返回网络接口信息的列表。仅用于Unix。
socket.if_nametoindex(if_name)
返回网络接口名称对应的接口索引值。仅用于Unix。
socket.accept()
接收一个连接。返回元组(连接, 地址)。
socket.bind(address)
绑定socket对象到指定地址。
socket.close()
标记socket对象已经关闭。
socket.connect(address)
连接到远程的服务器地址。
socket.connect_ex(address)
连接到远程的服务器地址,返回一个错误,不产生异常。
socket.detach()
关闭socket对象,但文件描述符还是有效的。
socket.dup()
复制一个socket对象。
socket.fileno()
返回一个socket对象的文件描述数字。
socket.get_inheritable()
如果能被子进程继承的,返回True。
socket.getpeername()
返回已经连接远端的地址。
socket.getsockname()
返回本地的地址。
socket.getsockopt(level, optname[, buflen])
返回socket设置的选项的值。
socket.gettimeout()
返回socket对象相关的超时时间。
socket.ioctl(control, option)
设置socket对象控制参数。仅用于Windows。
socket.listen(backlog)
服务器监听连接进来。参数backlog是指明接收连接的队列大小。
socket.makefile(mode='r', buffering=None, *, encoding=None, errors=None, newline=None)
绑定一个文件对象到socket对象。
socket.recv(bufsize[, flags])
从socket对象接收数据,返回包括数据bytes对象。
socket.recvfrom(bufsize[, flags])
从socket对象接收数据,返回元组(数据对象,地址)。
socket.recvmsg(bufsize[, ancbufsize[, flags]])
从socket对象接收数据和辅助数据。仅用于Unix。
socket.recvmsg_into(buffers[, ancbufsize[, flags]])
与函数recvmsg类似,不过它把数据和辅助数据都放到缓冲区。仅用于Unix。
socket.recvfrom_into(buffer[, nbytes[, flags]])
从socket对象接收数据到缓冲区,不创建新数据对象。
socket.recv_into(buffer[, nbytes[, flags]])
接收数据到指定缓冲区,不创建新数据对象返回。
socket.send(bytes[, flags])
把数据发送给socket对象。
socket.sendall(bytes[, flags])
连续地发送所有数据,或者遇到异常才返回。
socket.sendto(bytes, address)
socket.sendto(bytes, flags, address)
发送数据到指定地址,一般使用在无连接的socket。
socket.sendmsg(buffers[, ancdata[, flags[, address]]])
发送消息和辅助数据到socket对象。仅用于Unix。
socket.set_inheritable(inheritable)
设置socket对象可继承。
socket.setblocking(flag)
设置socket为阻塞,还是非阻塞状态。
socket.settimeout(value)
对阻塞的socket设置阻塞的超时时间。
socket.setsockopt(level, optname, value)
设置socket对象的可选项参数。
socket.shutdown(how)
发送socket关闭信号包给对方。
socket.share(process_id)
复制一个socket对象,并共享给目标进程。
socket.family
socket的网络分类。
socket.type
socket对象类型。
socket.proto
socket对象网络协议。
创建一个简单TCP服务器的例子:
#python 3.4 import socket HOST = '' PORT = 50007 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind((HOST, PORT)) s.listen(1) conn, addr = s.accept() print('Connected by', addr) while True: data = conn.recv(1024) if not data: break conn.sendall(data) conn.close()
在这个例子里,指定主机名称为空,端口为50007,然后调用函数socket()来创建一个socket对象,接着调用函数bind()绑定,调用函数listen()监听连接,调用函数accept()来接收连接进来并创建一个socket对象,然后与这个对象进行通讯,调用函数recv()接收数据,再通过函数sendall()发送数据回去。
创建TCP客户端的例子:
#python 3.4 import socket HOST = '127.0.0.1' # The remote host PORT = 50007 # The same port as used by the server s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((HOST, PORT)) s.sendall(b'Hello, world') data = s.recv(1024) s.close() print('Received', repr(data))
在这个例子里,指定连接本地IP地址127.0.0.1,服务器的端口为50007,调用函数socket()函数一个socket对象,调用函数connect()连接服务器,调用函数sendall()发送数据,接着调用函数recv()来接收服务器发送回来的数据,最后调用函数close()关闭socket对象。
蔡军生 QQ:9073204 深圳