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写入中英文字符串到文件的方法
May 06 Python
Python匹配中文的正则表达式
May 11 Python
深入浅析python定时杀进程
Jun 06 Python
在Linux命令行终端中使用python的简单方法(推荐)
Jan 23 Python
Python利用Beautiful Soup模块搜索内容详解
Mar 29 Python
Python标准库sched模块使用指南
Jul 06 Python
Python利用Django如何写restful api接口详解
Jun 08 Python
python使用pymongo操作mongo的完整步骤
Apr 13 Python
详解Python的循环结构知识点
May 20 Python
在Pycharm中调试Django项目程序的操作方法
Jul 17 Python
Python实现子类调用父类的初始化实例
Mar 12 Python
在pycharm中debug 实时查看数据操作(交互式)
Jun 09 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 simple_html_dom.php+正则 采集文章代码
2009/12/24 PHP
Yii使用ajax验证显示错误messagebox的解决方法
2014/12/03 PHP
php文件缓存类用法实例分析
2015/04/22 PHP
php从数据库中读取特定的行(实例)
2017/06/02 PHP
Thinkphp自定义生成缩略图尺寸的方法
2019/08/05 PHP
json数据处理技巧(字段带空格、增加字段、排序等等)
2013/06/14 Javascript
javascript中如何处理引号编码&amp;#034;
2013/08/15 Javascript
JavaScript 实现简单的倒计时弹窗DEMO附图
2014/03/05 Javascript
javascript实现二级级联菜单的简单制作
2015/11/19 Javascript
ES6通过babel转码使用webpack使用import关键字
2016/12/13 Javascript
Vue.directive使用注意(小结)
2018/08/31 Javascript
微信小程序 bindtap 传参的实例代码
2020/02/21 Javascript
Element实现表格嵌套、多个表格共用一个表头的方法
2020/05/09 Javascript
浅谈使用nodejs搭建web服务器的过程
2020/07/20 NodeJs
Python实现将doc转化pdf格式文档的方法
2018/01/19 Python
Pytorch训练过程出现nan的解决方式
2020/01/02 Python
Pytorch 神经网络—自定义数据集上实现教程
2020/01/07 Python
Python中有几个关键字
2020/06/04 Python
matplotlib基础绘图命令之bar的使用方法
2020/08/13 Python
一篇文章带你搞定Ubuntu中打开Pycharm总是卡顿崩溃
2020/11/02 Python
Python爬虫之App爬虫视频下载的实现
2020/12/08 Python
Monica Vinader官网:英国轻奢珠宝品牌
2020/02/05 全球购物
西班牙在线光学:Visual-Click
2020/06/22 全球购物
说说你所熟悉或听说过的j2ee中的几种常用模式?及对设计模式的一些看法
2012/05/24 面试题
说一下mysql, oracle等常见数据库的分页实现方案
2012/09/29 面试题
Java模拟试题
2014/11/10 面试题
财务管理专业应届毕业生求职信
2013/09/22 职场文书
简历中自我评价范文3则
2013/12/14 职场文书
总经理秘书工作职责
2013/12/26 职场文书
物流专业求职信
2014/06/30 职场文书
婚前协议书标准版
2014/10/19 职场文书
2014个人年度工作总结
2014/12/15 职场文书
优秀班主任申报材料
2014/12/16 职场文书
当幸福来敲门观后感
2015/06/01 职场文书
教师节获奖感言
2015/07/31 职场文书
如何用vue实现网页截图你知道吗
2021/11/17 Vue.js