socket
1.定义:
socket又称为“套接字”,应用程序通常通过套接字向网络发去请求,或者应答网络请求,使主机之间或者一台计算机中的进程可以通讯。
2.创建:
创建套接字
1 import socket
2
3 my_socket = socket.socket(family=AF_INIT, type=SOCK_STREAM, proto=0, fileno=None)
【参数】family:AF_INIT(IPv4地址族, 默认)
AF_INET6(IPv6地址族)
AF_UNIX(Unix地址族)
AF_CAN(CAN总线)
AF_RDS(汽车等移动收音)
type:SOCK_STREAM(流服务,默认,传输层TCP)
SOCK_DGRAM(数据包,传输层UDP)
SOCK_RAW(原始套接字,用来自行组装数据包)
proto:一般不填写,默认为0
当family=AF_CAN, proto则为CAN_RAW或者CAN_BCM
返回值:<class 'socket.socket'>
3.socket对象方法:
my_socket.bind(address, port):将套接字绑定到地址,address格式取决于地址族。AF_INET下,以(host, port)元组(host为str格式,port为int格式,组成元组)表示。address一般写空字符串,监听任意IP地址,后面端口自己设置,监听所有自己设置端口的任意IP地址发送的请求连接。
my_socket.listen(backlog):启动服务器以接收连接。backlog为拒绝连接之前可连接的最大数量,至少为0
# backlog 代表着有多少个已经建立的但是没有被 accept 取走的连接数量。
另外,有个内核参数 net.core.somaxconn 定义了 socket 同时 listen 的最大连接数,所以 socket.listen() 指定的值不能超过 net.core.somaxconn。
# (不常用)my_socket.setblocking(bool):默认值为True,如果设置False,recv()或者accept()无数据,则报错
my_socket.accept():服务器接收客户端连接。返回(cli_connect_address, port) # cli_connect_socket:client_connect_socket:客户端套接字,
# (不常用)socket.gethostname():返回python解释器当前运行的主机名
cli_socket.connect(address):客户端连接服务器。address格式取决于地址族。默认以address = (hostname, post),hostname为本机主机名,post为代连接服务器端口。
cli_socket.connect_ex(address):同上。只不过会有返回值。连接失败返回0,成功返回编码
my_socket.close()/cli_socket.close():关闭套接字。
s_cli_socket.recv(buffersize, flag):接收套接字数据。返回字符串,buffersize为最多接收的数量。
s_cli_socket.recvfrom(buffersize, flag):同上。返回(data, address),address为与之连接的地址。flag可省略。
s_cli_socket.send(string, flag):服务器接收连接后,向客户端发送数据。string可以为空。
sk.sendall(string, flag):向客户端发送全部数据。内部递归调用send(),成功返回None,失败抛出异常
sk.sendto(string[,flag],address):将数据发送到套接字,address是形式为(ipaddr,port)的元组,指定远程地
址。返回值是发送的字节数。该函数主要用于UDP协议。
sk.settimeout(timeout):设置套接字操作的超时期,timeout是一个浮点数,单位是秒。值为None表示没有超时
期。一般,超时期应该在刚创建套接字时设置,因为它们可能用于连接的操作(如 client 连接最多等待5s )
sk.getpeername():返回连接套接字的远程地址。返回值通常是元组(ipaddr,port)。
sk.getsockname():返回套接字自己的地址。通常是一个元组(ipaddr,port)
sk.fileno():套接字的文件描述符
se_socket.setsockopt(level, optname, value):设置给定套接字选项的值。level定义那个选项将被使用,通常为
SOL_SOCKET(正在使用的socket选项);当level=SOL_SOCK时,optname为下列值:
选项 | 定义 | 值 |
SO_BINDTODEVICE | 可以使socket只在某个特殊的网络接口(网卡)有效。也许不能是移动便携设备 | 一个字符串给出设备的名称或者一个空字符串返回默认值 |
SO_BROADCAST | 允许广播地址发送和接收信息包。只对UDP有效。如何发送和接收广播信息包 | 布尔型整数 |
SO_DONTROUTE | 禁止通过路由器和网关往外发送信息包。这主要是为了安全而用在以太网上UDP通信的一种方法。不管目的地址使用什么IP地址,都可以防止数据离开本地网络 | 布尔型整数 |
SO_KEEPALIVE | 可以使TCP通信的信息包保持连续性。这些信息包可以在没有信息传输的时候,使通信的双方确定连接是保持的 | 布尔型整数 |
SO_OOBINLINE | 可以把收到的不正常数据看成是正常的数据,也就是说会通过一个标准的对recv()的调用来接收这些数据 | 布尔型整数 |
SO_REUSEADDR | 当socket关闭后,本地端用于该socket的端口号立刻就可以被重用。通常来说,只有经过系统定义一段时间后,才能被重用。 | 布尔型整数 |
ser_socket.getsockopt(level, optname, [buflen]):返回套接字选项的值(bytes)。
ser_socket.makefile(mode='r', buffering=None, *, encoding=None, errors=None, newline=None):创建一个与该套接字相关联的文件,且该套接字必须处于阻塞模式,mode取值与内置的open()函数相同。