应用程序通常通过“套接字”(socket)向网络发出请求或者应答网络请求,使主机间或者计算机上的进程间可以通信Python。 提供了两种访问网络服务的功能。其中低级别的网络服务通过套接字实现,它提供了标准的 BSD 套接字 API,可以访问底层操作系统套接字接口的全部方法。而高级别的网络服务通过模块 SocketServer 实现,它提供了服务器中心类,可以简化网络服务器的开发。
socket 对象的内置函数和属性。在 Socket 库中,socket 对象提供了表 1 所示的内置函数。
函数 | 功能 |
---|---|
服务器端套接字函数 | |
bind() | 用于绑定地址(host, port)到套接字,在 AF_INET 下,以元组(host, port)的形式表示地址 |
listen() | 用于开始 TCP 监听。backlog 指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为 1,大部分应用程序设为 5 即可 |
accept() | 被动接受TCP客户端连接,(阻塞式)等待连接的到来 |
客户端套接字函数 | |
connect() | 主动初始化 TCP 服务器连接,一般 address 是形式为(hostname, port)的二元组,如果连接出错,则返回socket.error错误 |
connect_ex() | connect() 函数的扩展版本,在出错时返回出错码,而不是抛出异常 |
公共用途的套接字函数 | |
recv() | 接收 TCP 数据,数:据以字符串形式返回,bufsize 指定要接收的最大数据量,flags 提供有关消息的其他信息,通常可以忽略 |
send() | 发送 TCP 数据,将字符串中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于字符串的长度 |
sendall() | 完整发送 TCP 数据。将字符串中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。若成功,则返回 None;若失败,则抛出异常 |
recvform() | 接收 UDP 数据,与 recv() 的功能类似,但返回值是 (data, address)。其中 data 是包含接收数据的字符串,address 是发送数据的套接字地址 |
公共用途的套接字函数 | |
sendto() | 发送 UDP 数据,将数据发送到套接字,address 是形式为 (ipaddr, port) 的元组,用于指定远程地址。返回值是发送的字节数 |
close() | 关闭套接字 |
getpeername() | 返回连接套接字的远程地址。返回值通常是元组(ipaddr, port) |
getsockname() | 返回套接字自己的地址。返回值通常是元组(ipaddr, port) |
setsockopt(level, optname, value) | 设置给定套接字选项的值 |
getsockopt(level, optname[,buflen]) | 返回套接字选项的值 |
settimeout(timeout) | 设置套接字操作的超时时间,timeout 是一个浮点数,单位是秒。值为 None 表示没有超时时间。一般,超时时间应该在刚创建套接字时设置,因为它们可能用于连接的操作(如connect()) |
gettimeout() | 返回当前超时时间的值,单位是秒,如果没有设置超时时间,则返回 None |
fileno() | 返回套接字的文件描述符 |
setblocking(flag) | 如果 flag 为 0,则将套接字设为非阻塞模式;否则,将套接字设为阻塞模式(默认值)。在非阻塞模式下,如果调用 recv() 没有发现任何数据,或 send() 调用无法立即发送数据,那么将引起 socket.error 异常 |
makefile() | 创建一个与套接字相关联的文件 |
除上述内置函数之外,在 socket 模块中还提供很多与网络应用开发相关的属性和异常。表 2 列出了一些比较常用的属性和异常。
属性和异常 | 描述 |
---|---|
属性 | |
AF_UNIX、AF_INET、AF_INET6、AF_NETLINK、AF_TIPC | Python 中支持的套接字地址 |
SOCK_STREAM、SOCK_DGRAM | 套接字类型 (TCP=流, UDP=数据报) |
socket.AF_UNIX | 只能够在单一的UNIX系统进程间通信 |
socket.AF_INET | 服务器之间的网络通信 |
socket.AF_INET6 | IPv6 |
socket.SOCK_STREAM | 流式套接字,是为TCP服务的 |
socket.SOCK_DGRAM | 数据报式套接字,是为 UDP 服务的 |
socket.SOCK_RAW | 原始套接字,普通的套接字无法处理 ICMP、IGMP 等网络报文,而 SOCK_RAW 可以。另外 SOCK_RAW 也可以处理特殊的 IPv4 报文。利用原始套接字,可以通过 IP_HDRINCL 套接字选项由用户构造 IP 头 |
socket.SOCK_SEQPACKET | 可靠的连续数据包服务 |
has_ipv6 | 表示是否支持 IPv6 的布尔标记 |
异常 | |
error | 套接字错误 |
herror | 主机和地址错误 |
gaierror | 地址错误 |
timeout | 超时时间 |