python 关闭udp端口_python 解决粘包现象

1. recv 工作原理

  • 能够接收来自socket缓冲区的字节数据;
  • 当缓冲区没有数据可以读取时,recv会一直处于阻塞状态,知道缓冲区至少有一个字节数据可取,或者客户端关闭;
  • 关闭远程端并读取所有数据后,再recv会返回字符串。

2.升级版解决粘包问题

应用层自定义协议FTP(文件传输协议).

low版:

只能是有限的数据,将总数据长度固定成4个字节作为报头,再recv。当文件数据特别大时,会报错。

升级版优点:

1. 自定制报头。 如:dic = {'filename':xxx, 'md5':f454d5asfa5, 'total_size':1024*1024*1024}
2. 解决文件数据过大问题。

把报头做成字典,字典里包含将要发送的真实数据的描述信息(大小啊之类的),然后json序列化,然后用struck将序列化后的数据长度打包成4个字节。

我们在网络上传输的所有数据 都叫做数据包,数据包里的所有数据都叫做报文,报文里面不止有你的数据,还有ip地址、mac地址、端口号等等,其实所有的报文都有报头,这个报头是协议规定的。

思路:


服务端:

  1. 自定义报头,字典形式,里面存放文件信息等;
  2. 然后将报头字典 ——> json类型字符串 ——> 编码成 bytes类型数据;
  3. 将报头bytes类型的长度(len())——>固定成4个长度的字节,然后再send();
  4. 将报头bytes类型的内容数据 send();
  5. 再发送总数据,如果数据量特别大时,循环读取、发送字节。

客户端:

  1. 先收报头固定长度,再struct,得到报头数据的长度;
  2. 根据长度接收报头字节数据,再解码,反序列化成字典(json);
  3. 从字典获取文件、数据的描述信息(如文件名、大小等),再获取真实的数据。

服务端

3cf2cd2d452b12d4f16e1da4ea27d4ec.png

客户端

bdc69caffba8db97542ce1eaab366780.png

3. 基于UDP协议的socket通信

  1. 基于UDP协议的socket通信无需建立管道,先开启服务端或者客户端都可以;
  2. 基于UDP协议的socket通信,接收、发送一个消息都是无连接的;
  3. 只有拿到对方IP地址和端口就可以通信发消息,按照顺序接收服务端消息。

服务端

2b9e403e211a212a14f388880098ddcf.png

客户端

b669d6d727e7446d76671473bf67dc38.png

转自:python 解决粘包现象-侵删

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值