python网络编程调用recv函数完整接收数据的三种方法


Posted in Python onMarch 31, 2017

最近在使用python进行网络编程开发一个通用的tcpclient测试小工具。在使用socket进行网络编程中,如何判定对端发送一条报文是否接收完成,是进行socket网络开发必须要考虑的一个问题。这里,简要介绍一下判别数据接收接收完成常用的三种方法:

1.基础数据接收法:

使用基础数据接收法时,当与服务socket断开连接时,会接收到空字符串。因此,可以根据此特点,在程序中加入循环,一直接收数据,直到数据发送端关闭socket连接。适用场景:客户端和服务器的链接为短链接(即一次socket通讯后连接就会关闭)。代码如下:

import socket,struct,sys,time
Port=22220
#assume a socket disconnect (data returned is empty string) means all data was #done being sent.
def recv_basic(the_socket):
 total_data=[]
 while True:
  data = the_socket.recv(20480) 
  if not data: break
  total_data.append(data)
 return ''.join(total_data)

2.尾标识方法

通过寻找接收的协议数据中的尾标识字符串,获取完整的数据的数据报文。适用场景:接收的协议数据中包含相关的尾标识。代码如下:

End='something useable as an end marker'
def recv_end(the_socket):
 total_data=[];data=''
 while True:
   data=the_socket.recv(8192)
   if End in data:
    total_data.append(data[:data.find(End)])
    break
   total_data.append(data)
   if len(total_data)>1:
    #check if end_of_data was split
    last_pair=total_data[-2]+total_data[-1]
    if End in last_pair:
     total_data[-2]=last_pair[:last_pair.find(End)]
     total_data.pop()
     break
 return ''.join(total_data)

3.负载长度方法

即通过协议数据中的负载长度值,确定有效报文的长度,适用场景:协议数据中包含负载协议字段。这种方法也是比较常用和通用的一种方法,但是需要一边接收数据一边解析数据。代码如下: 

def recv_size(the_socket):
 #data length is packed into 4 bytes
 total_len=0;total_data=[];size=sys.maxint
 size_data=sock_data='';recv_size=8192
 while total_len<size:
  sock_data=the_socket.recv(recv_size)
  if not total_data:
   if len(sock_data)>4:
    size_data+=sock_data
    size=struct.unpack('>i', size_data[:4])[0]
    recv_size=size
    if recv_size>524288:recv_size=524288
    total_data.append(size_data[4:])
   else:
    size_data+=sock_data
  else:
   total_data.append(sock_data)
  total_len=sum([len(i) for i in total_data ])
 return ''.join(total_data)

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Python 相关文章推荐
Python yield 小结和实例
Apr 25 Python
python应用程序在windows下不出现cmd窗口的办法
May 29 Python
win7上python2.7连接mysql数据库的方法
Jan 14 Python
Python新手们容易犯的几个错误总结
Apr 01 Python
Python实现的建造者模式示例
Aug 06 Python
解决python DataFrame 打印结果不换行问题
Apr 09 Python
详解python 内存优化
Aug 17 Python
python如何调用百度识图api
Sep 29 Python
Python如何使用vars返回对象的属性列表
Oct 17 Python
python控制台打印log输出重复的解决方法
May 14 Python
python基础学习之递归函数知识总结
May 26 Python
Python中re模块的元字符使用小结
Apr 07 Python
Python爬取网易云音乐热门评论
Mar 31 #Python
Python中Django发送带图片和附件的邮件
Mar 31 #Python
使用Python对Access读写操作
Mar 30 #Python
使用Python对Excel进行读写操作
Mar 30 #Python
浅述python中argsort()函数的实例用法
Mar 30 #Python
Windows下安装python2和python3多版本教程
Mar 30 #Python
详解Python之数据序列化(json、pickle、shelve)
Mar 30 #Python
You might like
php 按指定元素值去除数组元素的实现方法
2011/11/04 PHP
PHP-redis中文文档介绍
2013/02/07 PHP
php连接函数implode与分割explode的深入解析
2013/06/26 PHP
一个经典的PHP文件上传类分享
2014/11/18 PHP
PHP CURL使用详解
2019/03/21 PHP
Javascript开发包大全整理
2006/12/22 Javascript
javascript-简单的日历实现及Date对象语法介绍(附图)
2013/05/30 Javascript
js中事件的处理与浏览器对象示例介绍
2013/11/29 Javascript
jquery的clone方法应用于textarea和select的bug修复
2014/06/26 Javascript
Javascript 正则表达式实现为数字添加千位分隔符
2015/03/10 Javascript
PHP+jQuery实现随意拖动层并即时保存拖动位置
2015/04/30 Javascript
全面解析Bootstrap中nav、collapse的使用方法
2016/05/22 Javascript
Bootstrap select实现下拉框多选效果
2016/12/23 Javascript
jQuery实现优雅的弹窗效果(6)
2017/02/08 Javascript
vue2笔记 — vue-router路由懒加载的实现
2017/03/03 Javascript
Node.js pipe实现源码解析
2017/08/12 Javascript
vue动态绘制四分之三圆环图效果
2019/09/03 Javascript
javascript实现简易数码时钟
2020/03/30 Javascript
浅谈Python基础之I/O模型
2017/05/11 Python
python pandas dataframe 行列选择,切片操作方法
2018/04/10 Python
Python2.7 实现引入自己写的类方法
2018/04/29 Python
python 同时运行多个程序的实例
2019/01/07 Python
在Python中将函数作为另一个函数的参数传入并调用的方法
2019/01/22 Python
python3实现猜数字游戏
2020/12/07 Python
Python数据可视化图实现过程详解
2020/06/12 Python
Django restful framework生成API文档过程详解
2020/11/12 Python
adidas马来西亚官网:adidas MY
2020/09/12 全球购物
优秀团员自我评价范文
2014/04/23 职场文书
团队精神的演讲稿
2014/05/14 职场文书
基层党员对照检查材料
2014/08/25 职场文书
情人节活动总结范文
2015/02/05 职场文书
《植树问题》教学反思
2016/03/03 职场文书
2016年妇联“6﹒26国际禁毒日”宣传活动总结
2016/04/05 职场文书
2019学校请假条格式及范文
2019/06/25 职场文书
nginx实现发布静态资源的方法
2021/03/31 Servers
python如何利用cv2模块读取显示保存图片
2021/06/04 Python