客户端流程
代码实现:day4/tcp_client.py![ ](https://img-blog.csdnimg.cn/20191129212407203.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTgxOTg4MA==,size_16,color_FFFFFF,t_70
- 创建套接字
注意:只有相同类型的套接字才能进行通信 - 请求连接
sockfd.connect(server_addr)
功能:连接服务器
参数:元组 服务器地址 - 收发消息
注意: 防止两端都阻塞,recv send要配合 - 关闭套接字
tcp 套接字数据传输特点
tcp连接中当一端退出,另一端如果阻塞在recv,此时recv会立即返回一个空串。
tcp连接中如果一端已经不存在,仍然试图通过send发送则会产生BrokenPipeError
一个监听套接字可以同时连接多个客户端,也能够重复被连接
网络收发缓冲区
- 网络缓冲区有效的协调了消息的收发速度
- send和recv实际是向缓冲区发送接收消息,当缓冲区不为空recv就不会阻塞。
tcp粘包
原因:tcp以字节流方式传输,没有消息边界。多次发送的消息被一次接收,此时就会形成粘包。
影响:如果每次发送内容是一个独立的含义,需要接收端独立解析此时粘包会有影响。
处理方法
- 人为的添加消息边界
- 控制发送速度
UDP套接字编程
服务端流程
代码实现:day4/udp_server.py
- 创建数据报套接字
sockfd = socket(AF_INET,SOCK_DGRAM) - 绑定地址
sockfd.bind(addr) - 消息收发
- 创建数据报套接字
sockfd = socket(AF_INET,SOCK_DGRAM) - 绑定地址
sockfd.bind(addr) - 消息收发
客户端流程
代码实现:day4/udp_client.py
- 创建套接字
- 收发消息
- 关闭套接字
总结 :tcp套接字和udp套接字编程区别 - 流式套接字是以字节流方式传输数据,数据报套接字以数据报形式传输
- tcp套接字会有粘包,udp套接字有消息边界不会粘包
- tcp套接字保证消息的完整性,udp套接字则不能
- tcp套接字依赖listen accept建立连接才能收发消息,udp套接字则不需要
- tcp套接字使用send,recv收发消息,udp套接字使用sendto,recvfrom
socket套接字属性
代码实现:day4/sock_attr.py
【1】 sockfd.type 套接字类型
【2】 sockfd.family 套接字地址类型
【3】 sockfd.getsockname() 获取套接字绑定地址
【4】 sockfd.fileno() 获取套接字的文件描述符
【5】 sockfd.getpeername() 获取连接套接字客户端地址
【6】 sockfd.setsockopt(level,option,value)
功能:设置套接字选项
参数: level 选项类别 SOL_SOCKET
option 具体选项内容
value 选项值
struct模块进行数据打包
代码实现:day5/struct_recv.py
代码实现:day5/struct_send.py
- 原理: 将一组简单数据进行打包,转换为bytes格式发送。或者将一组bytes格式数据,进行解
析。 - 接口使用
Struct(fmt)
功能: 生成结构化对象
参数:fmt 定制的数据结构
st.pack(v1,v2,v3…)
功能: 将一组数据按照指定格式打包转换为bytes
参数:要打包的数据
返回值: bytes字节串
st.unpack(bytes_data)
功能: 将bytes字节串按照指定的格式解析
参数: 要解析的字节串
返回值: 解析后的内容
struct.pack(fmt,v1,v2,v3…)
struct.unpack(fmt,bytes_data)
说明: 可以使用struct模块直接调用pack unpack。此时这两函数第一个参数传入fmt。其他用法功能相同