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中关于时间和日期函数的常用计算总结(time和datatime)
Mar 08 Python
python with statement 进行文件操作指南
Aug 22 Python
Python实现的简单文件传输服务器和客户端
Apr 08 Python
python3获取两个日期之间所有日期,以及比较大小的实例
Apr 08 Python
Python2与Python3的区别实例总结
Apr 17 Python
Python多线程及其基本使用方法实例分析
Oct 29 Python
python科学计算之scipy——optimize用法
Nov 25 Python
Python利用多线程同步锁实现多窗口订票系统(推荐)
Dec 22 Python
python cv2在验证码识别中应用实例解析
Dec 25 Python
keras实现theano和tensorflow训练的模型相互转换
Jun 19 Python
Python 执行矩阵与线性代数运算
Aug 01 Python
numpy数据类型dtype转换实现
Apr 24 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
ninety plus是什么?ninety plus咖啡好吗?
2021/03/04 新手入门
php下intval()和(int)转换使用与区别
2008/07/18 PHP
php的array_multisort()使用方法介绍
2012/05/16 PHP
Yii学习总结之安装配置
2015/02/22 PHP
腾讯CMEM的PHP扩展编译安装方法
2015/09/25 PHP
PHP addslashes()函数讲解
2019/02/03 PHP
幻宇的层模拟窗口效果-提供演示和下载
2007/01/20 Javascript
jQuery checkbox全选/取消全选实现代码
2009/11/14 Javascript
JS中引用百度地图并将百度地图的logo和信息去掉
2013/09/29 Javascript
jquery动态加载js/css文件方法(自写小函数)
2014/10/11 Javascript
JS+CSS实现滑动切换tab菜单效果
2015/08/25 Javascript
jquery插件EasyUI中form表单提交实例分享
2016/01/11 Javascript
jQuery图片前后对比插件beforeAfter用法示例【附demo源码下载】
2016/09/20 Javascript
Bootstrap导航条学习使用(一)
2017/02/08 Javascript
详解AngularJS通过ocLazyLoad实现动态(懒)加载模块和依赖
2017/03/01 Javascript
Vue.js如何实现路由懒加载浅析
2017/08/14 Javascript
gulp安装以及打包合并的方法教程
2017/11/19 Javascript
NodeJs form-data格式传输文件的方法
2017/12/13 NodeJs
koa上传excel文件并解析的实现方法
2018/08/09 Javascript
javascript系统时间设置操作示例
2019/06/17 Javascript
Python魔术方法详解
2015/02/14 Python
Django中对通过测试的用户进行限制访问的方法
2015/07/23 Python
python将unicode转为str的方法
2017/06/21 Python
python 把文件中的每一行以数组的元素放入数组中的方法
2018/04/29 Python
浅谈python下含中文字符串正则表达式的编码问题
2018/12/07 Python
Python 保存矩阵为Excel的实现方法
2019/01/28 Python
python读取.mat文件的数据及实例代码
2019/07/12 Python
python实现简易学生信息管理系统
2020/04/05 Python
如何用Python进行时间序列分解和预测
2021/03/01 Python
什么是serialVersionUID
2016/03/04 面试题
小学老师寄语大全
2014/04/04 职场文书
学前班评语大全
2014/05/04 职场文书
新党章心得体会
2014/09/04 职场文书
纺织工程专业推荐信
2014/09/08 职场文书
师德师风自我评价范文
2014/09/11 职场文书
答辩状格式范本
2015/05/22 职场文书