1. socket【套接字】
大家都知道,任何一门语言要读写文件,都会调用操作系统提供的文件API,比如open、read、write、close等等。那如果要通过网卡去收发数据呢?这时候就需要操作系统提供的socket了。
python可以通过在文件头部执行以下语句,调用操作系统提供的socket API(python标准socket库)。
import socket
上面的socket是一个module,对应了一个.py文件,里面提供了一些常量、类和方法,比如:
socket.socket: 代表socket类
socket.AF_INET: 代表一个常量,表示IPv4协议
socket.AF_INET6: 代表一个常量,表示IPv6协议
socket.SOCKET_STTEAM: 代表一个常量,表示TCP协议
socket.SOCKET_DGRAM: 代表一个常量,表示UDP协议
socket.SOCKET_RAW: 代表一个常量,表示直接在网络层传输数据,而不是通过TCP/UDP
2. tcp socket
我们可以通过实例化类socket.socket来创建一个socket【套接字】,不过我们需要给定输入参数,告知python解释器,你创建的socket是TCP的socket还是UDP的socket,亦或者原始socket(即直接在网络层收发数据的socket)。执行以下命令创建一个tcp socket。
import socket
tcp_sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
3 修改socket参数的常用方法
上文我们创建了一个tcp的socket,有时候我们需要对创建的socket,进行参数的设置,这时候我们就会调用一些方法,来达成我们的目的,如下表所示,当然了,这些方法不仅仅针对tcp的socket,也包括udp其他的socket。
socket参数修改方法 | 作用 | 输入参数 | 返回参数 | 备注 |
sk.setblocking(True) | 设置socket为阻塞模式 | True:表示阻塞;False:表示非阻塞 | | |
sk.settimeout(time) | 设置超时数据 | 设置的秒数 | | |
sk.setsockopt(level, optname, value) | 设置socket参数,比如发送、接收缓冲区大小 | 参数的级别,名称以及值 | | |
sk.gettimeout() | 获取超时时间 | | 超时的秒数 | |
sk.getsockopt(level, optname) | 获取socket参数值 | 参数的级别和名称 | 参数的值 | |
sk.getsockname() | 获取本地socket | | 本地socket,元组形式 | |
sk.getpeername() | 获取远端socket | | 远端socket,元组形式 | 不是任意一个socket都可以,不支持的socket会抛出异常 |
4. tcp socket的常用方法
创建完socket实例后,我们就可以使用响应的实例方法,来创建连接、收发数据以及关闭连接,当然还可以更改socket的参数。针对tcp的socket,常用的实例方法有:
tcp socket常用的方法 | 适用于 | 作用 | 输入参数 | 返回值 | 异常 |
tcp_sk.bind((host, port)) | 服务器 | 服务器向操作系统申请一个端口 | 服务器的ip/域名和端口组成的一个元组, 例如(host, port),不是两个变量host, port。
| None:表示申请地址和端口成功 | 地址或者端口被占用,抛出异常 |
tcp_sk.listen(backlog) | 服务器 | 服务器侦听已经申请的端口 | 最多接收的客户端连接数 | | |
tcp_sk.accept() | 服务器 | 服务器接收客户端连接 | 空 | 有两个,一个是客户端的socket,另一个是客户端地址和端口组成的元组 | |
tcp_sk.connect((host, port)) | 客户端 | 客户端主动向服务器发起建立连接 | 要连接服务器的ip/域名和端口组成的元组,同上bind方法 | None:表示连接建立成功 | 服务器拒绝此连接,或者不响应此连接,抛出异常 |
tcp_sk.shutdown (socket.SHUT_RDWR) | 客户端/服务器均可 | 关闭已经建立的连接 | 关闭连接的方向,例如socket.SHUT_RDWR:读写方向;socket.SHUT_RD:读方向;socket.SHUT_WR:写方向 | None:表示关闭连接成功 | |
tcp_sk.recv(bufsize) | 客户端/服务器均可 | 从连接上接收数据 | python程序缓冲区大小,即程序允许期间分配的内存的大小 | 一次接收到的数据,大小不超过bufsize,该数据是字节串,需要解码后才能使用 | |
tcp_sk.sendall(data) | 客户端/服务器均可 | 向连接上发送数据 | 要发送的数据,该数据必须是bytes类型,否则要先编码成字节串,再发送 | None:表示发送数据成功 | |