python标准库提供了一个socket套接字模块,可以调用该模块进行网络通信
1. socket对象
socket.socket(family,type)
该方法创建并返回一个新的socket对象,这也是socket模块最常用的方法。
family参数指的是host的种类:
AF_UNIX:也叫AF_LOCAL,基于本地文件的
AF_NETLINK:这是linux系统支持的一种套接字
AF_INET:这个套接字是基于网络的,对于IPV4协议的TCP和UDP(常用)
AF_INET6:这个套接字是基于网络的,对于IPV6协议的TCP和UDP
type参数指的是套接字类型:
SOCK_STREAM:流套接字,使用TCP socket(常用)
SOCK_DGRAM:数据包问套接字,使用UDP socket(常用)
SOCK_RAW:raw套接字
这些参数在socket模块有定义
2. socket对象的方法
记 s=socket.socket(family,type)
(1)s.bind(address)
将socket绑定到一个地址和端口上,通常用于socket服务端
address必须是一个双元素元组,格式为:(ip or host,port)
如果端口号正在被使用或者主机名或IP地址错误,则引发socket.error异常。
端口号的使用是有限制的,在linux或者unix之中只有系统管理员才能使用1024以下的端口,这些端口号用于标准服务。
(2)s.accept()
返回一个客户机socket,带有客户机端的地址信息。
调用accept方法的时候,socket会进入阻塞状态。客户请求连接时,方法建立连接并返回服务器。
accept方法返回一个双元素元组,形如(connection,address)。第一个元素是新的socket对象,第二个元素是客户的IP地址。
当一个连接close之后,可以接着调用accept继续接收从客户端发来的连接请求,因为listen让服务器一直处于监听的状态。
(3)s.listen(backlog)
将socket设置成监听模式,可以监听backlog外来的连接请求,让服务器开始监听客户端发来的连接请求
这个方法设置服务器为监听状态,backlog制定了最多的连接数,至少为1.接到连接请求后,这些请求必须排队,如果队列达到backlog的数值,则拒绝接下来的连接请求
(4)s.connect(address)
将socket连接到定义的主机和端口上,通常用于socket客户端
address必须是一个双元素元组,格式为:(ip or host,port)
(5) s.recv(bufsize, flags)
从已连接的socket获取数据,返回值是一个字符串,代表接收到的数据。
bufsize表示一次能接收的最大数据,为了最佳匹配硬件和网络的实际情况,bufsize 的值应为 2 的相对较小的幂,如 4096。
flags一般设为0
recv方法接收数据时会进入阻塞状态,最后返回一个字符串,表示收到的数据。如果发送数据超过recv所允许,数据会被截断。多余的数据将缓冲于接收端。以后调用recv时,多余的数据会从缓冲区删除。
(6) s.send(data, flags)
通过socket发送指定的数据data,data是一个字符串
flag可以不理会
send方法返回已发送的字符个数。
(7) s.close()
关闭socket连接
传输结束,通过调用close方法关闭连接
(8) s.fileno()
返回套接字的文件描述符
(9) s.getsockname()
返回套接字本身的(ip, port)
(10) s.getpeername()
返回套接字远程连接的(ip, port)
(11) s.getsockopt(level,optname,buflen)
返回由level和optname指定的套接字选项的值,buflen用于接收套接字选项值的缓冲区大小
(12) s.setsockopt(level, optname, value)
把level和optname指定的套接字选项设为value
(13) s.shut_down(how)
关闭一端或者两端的链接。
how设定为SHUT_RD,则不再接收数据
how设定为SHUT_WR,则不再发送数据
how设定为SHUT_RDWR,则不再发送数据,也不再接收数据
(14) s.settimeout(value)
设置最长阻塞时间
(15) s.settimeout()
获取阻塞最长时间
(16) s.recvfrom(buf, flags)
从套接字中获取数据,返回值格式为(string,address),其中address为发送方的地址,格式为(ip,port)
flags默认为0
(17) s.sendto(string, address)
发送数据string给套接字,接收地址为address,地址格式(ip,port)
socket模块中的方法
(1) socket.create_connection(address , timeout , source_address )
create_connection类似于connect函数,但是比connect更高级。
address格式为(ip or host,port)。如果 host 是非数字主机名,它将尝试从 AF_INET
和 AF_INET6
解析它,然后依次尝试连接到所有可能的地址,直到连接成功。这使得编写兼容 IPv4 和 IPv6 的客户端变得容易。
传入可选参数 timeout 可以在套接字实例上设置超时(在尝试连接前)。如果未提供 timeout,则使用由 getdefaulttimeout()
返回的全局默认超时设置。
如果提供了 source_address,它必须为二元组 (host, port)
,以便套接字在连接之前绑定为其源地址。如果 host 或 port 分别为 ‘’ 或 0,则使用操作系统默认行为。
(2) socket.has_ipv6
指示当前平台是否支持IPV6
(3) socket.gethostbyname(hostname)
把主机名(如 www.baidu.com)转换为IPV4地址
(4) socket.gethostname(hostname)
返回当前运行python解释器的机器的主机名
(5) socket.ntohl(x)
把32位正整数从网络字节序转换为主机字节序
(6) socket.ntohs(x)
把16位正整数从网络字节序转换为主机字节序
(7) socket.htonl(x)
把32位正整数从主机字节序转换为网络字节序
(8) socket.htons(x)
把16位正整数从主机字节序转换为网络字节序
(9) socket.inet_pton(address_family, ip_string)
将特定地址簇的 IP 地址(字符串)转换为压缩二进制格式。
(10) socket.inet_ntop(address_family, packed_ip)
将压缩二进制格式转换为字符串格式。
(11) socket.getdefaulttimeout( )
返回用于新套接字对象的默认超时(以秒为单位的浮点数)。值 None
表示新套接字对象没有超时。首次导入 socket 模块时,默认值为 None
。
(12) socket.setdefaulttimeout(timeout)
设置用于新套接字对象的默认超时(以秒为单位的浮点数)