网络编程(2)
1|0一、 网络编程(2)
1|11. subprocess模块
-
subprocess 有什么用
它是和操作系统交互,实现操作系统的命令执行和结果展示
-
实例:
1|22. 粘包问题
-
什么是粘包问题
客户端第一次发送的数据,服务端无法精确一次性接受完毕。
下一次发送的数据与上一次数据粘在一起了。 -
TCP粘包和UDP为什么不粘包
先说TCP:由于TCP协议本身的机制(面向连接的可靠地协议-三次握手机制)客户端与服务器会维持一个连接(Channel),数据在连接不断开的情况下,可以持续不断地将多个数据包发往服务器,但是如果发送的网络数据包太小,那么他本身会启用Nagle算法(可配置是否启用)对较小的数据包进行合并(基于此,TCP的网络延迟要UDP的高些)然后再发送(超时或者包大小足够)。那么这样的话,服务器在接收到消息(数据流)的时候就无法区分哪些数据包是客户端自己分开发送的,这样产生了粘包;服务器在接收到数据库后,放到缓冲区中,如果消息没有被及时从缓存区取走,下次在取数据的时候可能就会出现一次取出多个数据包的情况,造成粘包现象(确切来讲,对于基于TCP协议的应用,不应用包来描述,而应 用 流来描述),个人认为服务器接收端产生的粘包应该与linux内核处理socket的方式 select轮询机制的线性扫描频度无关。
再说UDP:本身作为无连接的不可靠的传输协议(适合频繁发送较小的数据包),他不会对数据包进行合并发送(也就没有Nagle算法之说了),他直接是一端发送什么数据,直接就发出去了,既然他不会对数据合并,每一个数据包都是完整的(数据+UDP头+IP头等等发一次数据封装一次)也就没有粘包一说了。
UDP不存在粘包问题,是由于UDP发送的时候,没有经过Negal算法优化,不会将多个小包合并一次发送出去。另外,在UDP协议的接收端,采用了链式结构来记录每一个到达的UDP包,这样接收端应用程序一次recv只能从socket接收缓冲区中读出一个数据包。也就是说,发送端send了几次,接收端必须recv几次(无论recv时指定了多大的缓冲区)。
-
TCP协议特性:
tcp协议是一个流式协议,会将多次连续发送数据量小、并且时间间隔短的数据一次性打包发送。 -
解决粘包问题:
解决粘包问题的方法之一是使用struct
模块。
struck
模块是一个可以将数据的大小长度,压缩成固定的长度的一个标记(数据报头)。 -
struct
模块先通过pack
方法根据数据的二进制长度生成一个大小为 4 的报头。通过unpack
方法解包这个报头,得到这个要发送的数据的二进制大小。unpack
方法返回的是一个元组。 -
在python中,只有字符串才能直接编码转换成二进制,其他任意数据类型都要先转换成
json
和pickle
数据类型,再将这个转换后的json
和pickle
数据编码成二进制类型。
1|33. UDP 协议
-
UDP协议是一种传输协议。
-
UDP协议的特点:
- 不需要先建立连接
- 不会粘包
- 客户端给服务端发送数据,不需要等待服务端返回接收成功
- 数据容易丢失,数据不安全
-
TCP 就好比在打电话
-
UDP 就好比在发短信
1|44. SocketServer 模块
-
python内置模块,可以简化socket套接字服务端的代码。
-
优点:简化TCP 与 UDP 服务端的代码
-
缺点:必须创建一个类
-
实例:
1|55. 上传大文件
__EOF__

本文链接:https://www.cnblogs.com/Mcoming/p/11698720.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!