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中copy()方法的使用
May 21 Python
Python实现统计英文单词个数及字符串分割代码
May 28 Python
python 实现tar文件压缩解压的实例详解
Aug 20 Python
Django REST为文件属性输出完整URL的方法
Dec 18 Python
Pandas 数据框增、删、改、查、去重、抽样基本操作方法
Apr 12 Python
pycharm 主题theme设置调整仿sublime的方法
May 23 Python
python添加菜单图文讲解
Jun 04 Python
pandas 强制类型转换 df.astype实例
Apr 09 Python
python+selenium+chrome批量文件下载并自动创建文件夹实例
Apr 27 Python
Python尾递归优化实现代码及原理详解
Oct 09 Python
详解Python常用的魔法方法
Jun 03 Python
Python数据结构之队列详解
Mar 21 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模拟socket一次连接,多次发送数据的实现代码
2011/07/26 PHP
PHP加密扩展库Mcrypt安装和实例
2013/11/10 PHP
PHP制作万年历
2015/01/07 PHP
php语言注释,单行注释和多行注释
2018/01/21 PHP
js直接编辑当前cookie的脚本
2008/09/14 Javascript
js 分栏效果实现代码
2009/08/29 Javascript
用JQuery调用Session的实现代码
2010/10/29 Javascript
javascript仿qq界面的折叠菜单实现代码
2012/12/12 Javascript
js简单实现用户注册信息的校验代码
2013/11/15 Javascript
jquery实现翻动fadeIn显示的方法
2015/03/05 Javascript
Bootstrap自定义文件上传下载样式
2016/05/26 Javascript
Bootstrap Modal遮罩弹出层代码分享
2016/11/21 Javascript
基于layer.js实现收货地址弹框选择然后返回相应的地址信息
2017/05/26 Javascript
JavaScript登录验证基础教程
2017/11/01 Javascript
修改node.js默认的npm安装目录实例
2018/05/15 Javascript
微信小程序出现wx.getLocation再次授权问题的解决方法分析
2019/01/16 Javascript
js 计算图片内点个数的示例代码
2019/04/04 Javascript
基于JS实现简单滑块拼图游戏
2019/10/12 Javascript
Vue实现图片与文字混输效果
2019/12/04 Javascript
如何使用webpack打包一个库library的方法步骤
2019/12/18 Javascript
不刷新网页就能链接新的js文件方法总结
2020/03/01 Javascript
在Python中使用dict和set方法的教程
2015/04/27 Python
简单实现python收发邮件功能
2018/01/05 Python
tensorflow创建变量以及根据名称查找变量
2018/03/10 Python
解决pytorch GPU 计算过程中出现内存耗尽的问题
2019/08/19 Python
Python批量启动多线程代码实例
2020/02/18 Python
python 使用while循环输出*组成的菱形实例
2020/04/12 Python
使用matplotlib的pyplot模块绘图的实现示例
2020/07/12 Python
俄罗斯化妆品和香水网上商店:Iledebeaute
2019/01/03 全球购物
土木工程毕业生推荐信
2013/10/28 职场文书
企业总经理岗位职责
2014/02/13 职场文书
搞笑婚礼主持词
2014/03/13 职场文书
租车协议书范本2014
2014/11/17 职场文书
复兴之路观后感
2015/06/02 职场文书
python创建字典及相关管理操作
2022/04/13 Python
MySQL 原理与优化之Limit 查询优化
2022/08/14 MySQL