python学习day32 黏包 struct模块

黏包

http://www.cnblogs.com/Eva-J/articles/8244551.html#_label5

 注意:只有TCP有粘包现象,UDP永远不会粘包

黏包成因:

多个send可能会发生黏包现象

优化算法不优化

发生黏包两种现象:

情况一 发送方的缓存机制

发送端需要等缓冲区满才发送出去,造成粘包(发送数据时间间隔很短,数据了很小,会合到一起,产生粘包)

情况二 接收方的缓存机制

接收方不及时接收缓冲区的包,造成多个包接收(客户端发送了一段数据,服务端只收了一小部分,服务端下次再收的时候还是从缓冲区拿上次遗留的数据,产生粘包)

 如何解决黏包?

存在的问题:
多了一次交互。程序的运行速度远快于网络传输速度,所以在发送一段字节前,先用send去发送该字节流长度,这种方式会放大网络延迟带来的性能损耗

struct模块

该模块可以把一个类型,如数字,转成固定长度的bytes

这个模块可以把要发送的数据长度转换成固定长度的字节。这样客户端每次接收消息之前只要先接受这个固定长度字节的内容看一看接下来要接收的信息大小,那么最终接受的数据只要达到这个值就停止,就能刚好不多不少的接收完整的数据了。

猜你喜欢

转载自www.cnblogs.com/happyfan/p/10450905.html