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使用7z解压apk包的方法
Apr 18 Python
Python的Django中django-userena组件的简单使用教程
May 30 Python
Python从MP3文件获取id3的方法
Jun 15 Python
使用Python对Csv文件操作实例代码
May 12 Python
Python实现的快速排序算法详解
Aug 01 Python
浅述python2与python3的简单区别
Sep 19 Python
pandas 空数据处理方法详解
Nov 02 Python
提升python处理速度原理及方法实例
Dec 25 Python
python对指定字符串逆序的6种方法(小结)
Apr 02 Python
python shapely.geometry.polygon任意两个四边形的IOU计算实例
Apr 12 Python
Python文件夹批处理操作代码实例
Jul 21 Python
next在python中返回迭代器的实例方法
Dec 15 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 urlencode()与urldecode()函数字符编码原理详解
2011/12/06 PHP
ThinkPHP做文字水印时提示call an undefined function exif_imagetype()解决方法
2014/10/30 PHP
PHP命名空间用法实例分析
2019/09/04 PHP
Laravel框架Blade模板简介及模板继承用法分析
2019/12/03 PHP
网页里控制图片大小的相关代码
2006/06/25 Javascript
Prototype1.5 rc2版指南最后一篇之Position
2007/01/10 Javascript
js导出格式化的excel 实例方法
2013/07/17 Javascript
iframe里面的元素触发父窗口元素事件的jquery代码
2014/10/19 Javascript
鼠标悬浮显示二级菜单效果的jquery实现
2014/10/29 Javascript
JavaScript中的anchor()方法使用详解
2015/06/08 Javascript
jQuery UI设置固定日期选择特效代码分享
2015/08/27 Javascript
使用jQuery操作HTML的table表格的实例解析
2016/03/13 Javascript
JavaScript 2048 游戏实例代码(简单易懂)
2016/03/25 Javascript
微信小程序 地图定位简单实例
2016/10/14 Javascript
js中利用cookie实现记住密码功能
2020/08/20 Javascript
js实现百度登录框鼠标拖拽效果
2017/03/07 Javascript
Bootstrap Table列宽拖动的方法
2018/08/15 Javascript
在js代码拼接dom对象到页面上的模板总结
2018/10/21 Javascript
Vue微信公众号网页分享的示例代码
2020/05/28 Javascript
JavaScript实现网页留言板功能
2020/11/23 Javascript
[04:49]2014DOTA2国际邀请赛 Newbee顺利挺进总决赛 ImbaTV独家专访
2014/07/19 DOTA
python实现的AES双向对称加密解密与用法分析
2017/05/02 Python
python如何获取服务器硬件信息
2017/05/11 Python
Python实现简单生成验证码功能【基于random模块】
2018/02/10 Python
详解Python在使用JSON时需要注意的编码问题
2019/12/06 Python
python如何快速生成时间戳
2020/07/21 Python
百联网上商城:i百联
2017/01/28 全球购物
日本热销NO.1胶原蛋白冻:Aishitoto爱希特多
2019/06/20 全球购物
船舶专业个人求职信范文
2014/01/02 职场文书
金融学专业大学生职业生涯规划
2014/03/07 职场文书
机械系毕业生求职信
2014/05/28 职场文书
党员个人整改方案及措施
2014/10/25 职场文书
世界文化遗产导游词
2019/08/07 职场文书
Python基础教程,Python入门教程(超详细)
2021/06/24 Python
Java移除无效括号的方法实现
2021/08/07 Java/Android
Nginx 路由转发和反向代理location配置实现
2021/11/11 Servers