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和Ruby中each循环引用变量问题(一个隐秘BUG?)
Jun 04 Python
python制作花瓣网美女图片爬虫
Oct 28 Python
Python二叉搜索树与双向链表转换实现方法
Apr 29 Python
Python简单获取自身外网IP的方法
Sep 18 Python
Python自动化运维_文件内容差异对比分析
Dec 13 Python
python3 pandas 读取MySQL数据和插入的实例
Apr 20 Python
基于scrapy的redis安装和配置方法
Jun 13 Python
Python自动采集微信联系人的实现示例
Feb 28 Python
Python configparser模块配置文件过程解析
Mar 03 Python
Python celery原理及运行流程解析
Jun 13 Python
Python基础之函数嵌套知识总结
May 23 Python
pytorch DataLoader的num_workers参数与设置大小详解
May 28 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/12/19 PHP
php不使用插件导出excel的简单方法
2014/03/04 PHP
PHP实现仿Google分页效果的分页函数
2015/07/29 PHP
Laravel中基于Artisan View扩展包创建及删除应用视图文件的方法
2016/10/08 PHP
更正确的asp冒泡排序
2007/05/24 Javascript
JavaScript Event学习第二章 Event浏览器兼容性
2010/02/07 Javascript
js弹窗代码 可以指定弹出间隔
2010/07/03 Javascript
JavaScript的document对象和window对象详解
2010/12/30 Javascript
JavaScript中的prototype.bind()方法介绍
2014/04/04 Javascript
Javascript中的关键字和保留字整理
2014/10/16 Javascript
DOM基础教程之事件对象
2015/01/20 Javascript
JS模仿手机端九宫格登录功能实现代码
2016/04/28 Javascript
JS基于clipBoard.js插件实现剪切、复制、粘贴
2016/05/03 Javascript
举例讲解jQuery对DOM元素的向上遍历、向下遍历和水平遍历
2016/07/07 Javascript
Vue.js组件使用开发实例教程
2016/11/01 Javascript
js实现简单的网页换肤效果
2017/01/18 Javascript
详解微信小程序 相对定位和绝对定位
2017/05/11 Javascript
JS/HTML5游戏常用算法之追踪算法实例详解
2018/12/12 Javascript
vue 翻页组件vue-flip-page效果
2020/02/05 Javascript
[13:55]Newbee vs Team Spirit
2018/06/07 DOTA
Python环境变量设置方法
2016/08/28 Python
Python3 selenium 实现QQ群接龙自动化功能
2020/04/17 Python
使用 django orm 写 exists 条件过滤实例
2020/05/20 Python
Python中如何引入第三方模块
2020/05/27 Python
Docker如何部署Python项目的实现详解
2020/10/26 Python
HTML5各种头部meta标签的功能(推荐)
2017/03/13 HTML / CSS
HTML5 Canvas实现放大镜效果示例
2020/03/25 HTML / CSS
巴西一家专门从事家居和装饰的连锁店:Camicado
2019/08/14 全球购物
Nike瑞士官网:Nike CH
2021/01/18 全球购物
岗位聘任书范文
2014/03/29 职场文书
爱护草坪标语
2014/06/24 职场文书
小学教师师德整改措施
2014/09/29 职场文书
2014年物流工作总结
2014/11/25 职场文书
公司慰问信范文
2015/03/23 职场文书
领导离职感言
2015/08/03 职场文书
linux下导入、导出mysql数据库命令的实现方法
2021/05/26 MySQL