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上发送。

img

1.1 函数细节

1.1.1 socket()

使用给定的地址族、socket类型和协议号创建一个新的 socket。
socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)

  • family:地址族
    • AF_INETAF_UNIX为常见,前者为设备间,后者为设备内部
  • type:socket类型
    • SOCK_STREAMSOCK_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 的相对较小的幂

1.2. .close()

1.3 C/S 模板

posted @ 2023-09-22 09:59  LASER_06  阅读(25)  评论(0)    收藏  举报