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:表示发送数据成功