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 相关文章推荐
有关wxpython pyqt内存占用问题分析
Jun 09 Python
python中类的一些方法分析
Sep 25 Python
Python实现保证只能运行一个脚本实例
Jun 24 Python
python字符串中的单双引
Feb 16 Python
python实现TF-IDF算法解析
Jan 02 Python
Python数据结构之哈夫曼树定义与使用方法示例
Apr 22 Python
Python并发之多进程的方法实例代码
Aug 15 Python
Django REST Framework序列化外键获取外键的值方法
Jul 26 Python
django 数据库连接模块解析及简单长连接改造方法
Aug 29 Python
pyinstaller打包程序exe踩过的坑
Nov 19 Python
python中图像通道分离与合并实例
Jan 17 Python
Pytorch中的数据集划分&正则化方法
May 27 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中判断文件空目录是否有读写权限的函数代码
2012/08/07 PHP
php实现的mongodb操作类
2015/05/28 PHP
PHP中new static()与new self()的比较
2016/08/19 PHP
PHP面向对象类型约束用法分析
2019/06/12 PHP
laravel withCount 统计关联数量的方法
2019/10/10 PHP
用于判断用户注册时,密码强度的JS代码
2009/01/01 Javascript
Jquery 设置标题的自动翻转
2009/10/03 Javascript
Javascript面向对象编程(三) 非构造函数的继承
2011/08/28 Javascript
了解了这些才能开始发挥jQuery的威力
2013/10/10 Javascript
详解JavaScript中的异常处理方法
2015/06/16 Javascript
jQuery的Scrollify插件实现滑动到页面下一节点
2015/07/05 Javascript
常见JS验证脚本汇总
2015/12/01 Javascript
原生JS实现平滑回到顶部组件
2016/03/16 Javascript
jQuery表单验证插件解析(推荐)
2016/07/21 Javascript
微信小程序 122100版本更新问题解决方案
2016/12/22 Javascript
Angular2 Service实现简单音乐播放器服务
2017/02/24 Javascript
canvas轨迹回放功能实现
2017/12/20 Javascript
vue绑定事件后获取绑定事件中的this方法
2018/09/15 Javascript
JS数组Object.keys()方法的使用示例
2019/06/05 Javascript
bootstrap table实现横向合并与纵向合并
2019/07/18 Javascript
Javascript实现秒表计时游戏
2020/05/27 Javascript
[02:23]2018DOTA2亚洲邀请赛趣味视频——反应测试
2018/04/04 DOTA
简述Python中的进程、线程、协程
2016/03/18 Python
Python按行读取文件的实现方法【小文件和大文件读取】
2016/09/19 Python
Python 中的lambda函数介绍
2018/10/10 Python
大家都说好用的Python命令行库click的使用
2019/11/07 Python
python报错: 'list' object has no attribute 'shape'的解决
2020/07/15 Python
Django生成数据库及添加用户报错解决方案
2020/10/09 Python
与世界上最好的跑步专业品牌合作:Fleet Feet
2019/03/22 全球购物
爸爸的花儿落了教学反思
2014/02/20 职场文书
《春到梅花山》教学反思
2014/04/16 职场文书
2014年度安全生产目标管理责任书
2014/07/25 职场文书
2019如何书写演讲稿?
2019/07/01 职场文书
浅谈Python响应式类库RxPy
2021/06/14 Python
mysql获取指定时间段中所有日期或月份的语句(不设存储过程,不加表)
2021/06/18 MySQL
java中如何截取字符串最后一位
2022/07/07 Java/Android