Python通信
一、Socket通信
用到的包:
import socket
Server:按序执行 socket(), bind(), listen(), accept() (可能需要重复执行 accept() 以服务多个客户端)。
socket()返回的socket用于监听(listen)和接受(accept),这个socket不能用于与Client之间发送和接收数据。
每个连接进来的Client,都会通过accept()返回一个不同的Client的socket对象和属于Client的socket.
比如:一共有3个Client连接到Server,那么在Server就移动有4个socket
Client:按序执行 socket(), connect()。还须注意,服务器不在侦听socket上发送 sendall()/recv(),而是在 accept() 返回的新socket上发送。

1.1 函数细节
1.1.1 socket()
使用给定的地址族、socket类型和协议号创建一个新的 socket。
socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)
- family:地址族;
- 以
AF_INET和AF_UNIX为常见,前者为设备间,后者为设备内部。
- 以
- type:socket类型;
- 以
SOCK_STREAM和SOCK_DGRAM为常见,前者为TCP,后者为UDP。
- 以
- proto:协议号;
- 协议号通常为零并且可以省略,或在协议族为 AF_CAN 的情况下,协议应为 CAN_RAW, CAN_BCM, CAN_ISOTP 或 CAN_J1939 之一。
1.2 Socket对象
1.2.0 汇总
- **服务端套接字函数**
s.bind() #绑定(主机,端口号)到套接字
s.listen() #开始TCP监听
s.accept() #被动接受TCP客户的连接,(阻塞式)等待连接的到来
- **客户端套接字函数**
s.connect() #主动初始化TCP服务器连接
s.connect_ex() #connect()函数的扩展版本,出错时返回出错码,而不是抛出异常
- **公共用途的套接字函数**
s.recv() #接收TCP数据
s.send() #发送TCP数据(send在待发送数据量大于己端缓存区剩余空间时,数据丢失,不会发完)
s.sendall() #发送完整的TCP数据(本质就是循环调用send,sendall在待发送数据量大于己端缓存区剩余空间时,数据不丢失,循环调用send直到发完)
s.recvfrom() #接收UDP数据
s.sendto() #发送UDP数据
s.getpeername() #连接到当前套接字的远端的地址
s.getsockname() #当前套接字的地址
s.getsockopt() #返回指定套接字的参数
s.setsockopt() #设置指定套接字的参数
s.close() #关闭套接字
- **面向锁的套接字方法**
s.setblocking() #设置套接字的阻塞与非阻塞模式
s.settimeout() #设置阻塞套接字操作的超时时间
s.gettimeout() #得到阻塞套接字操作的超时时间
- **面向文件的套接字方法**
s.fileno() #套接字的文件描述符
s.makefile() #创建一个与该套接字相关的文件
1.2.1 .bind(address)
将
socket绑定到address,在此前必须未被绑定。
address格式常见为(HOST, PORT),分别为IP地址与端口号。
Client与Server的端口号应该保持一致。
1.2.2 .listen(backlog)
启动一个服务器用于接受连接。如果指定
backlog(最大容量),则它最低为 0(小于 0 会被置为 0),它指定系统允许暂未 accept 的连接数,超过后将拒绝新连接。未指定则自动设为合理的默认值。
1.2.3 .accept()
接受一个连接,此 socket 必须绑定到一个地址上并且监听连接。返回值是一个 (conn, address) 对,其中 conn 是一个 新的socket对象,用于在此连接上收发数据,address 是 Client的ip。
1.2.4 .connect()
连接到 address 处的远程套接字。
1.2.5 .recv(bufsize)
从 socket 接收数据。返回值是一个byte对象,表示接收到的数据。bufsize 指定一次接收的最大数据量,bufsize 的值应为 2 的相对较小的幂

浙公网安备 33010602011771号