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中threading超线程用法实例分析
May 16 Python
python版本坑:md5例子(python2与python3中md5区别)
Jun 20 Python
spyder常用快捷键(分享)
Jul 19 Python
python读文件保存到字典,修改字典并写入新文件的实例
Apr 23 Python
python 脚本生成随机 字母 + 数字密码功能
May 26 Python
Python测试网络连通性示例【基于ping】
Aug 03 Python
python如何解析配置文件并应用到项目中
Jun 27 Python
使用Python画出小人发射爱心的代码
Nov 23 Python
python3.7通过thrift操作hbase的示例代码
Jan 14 Python
Python打包工具PyInstaller的安装与pycharm配置支持PyInstaller详细方法
Feb 27 Python
python对一个数向上取整的实例方法
Jun 18 Python
浅谈Python里面None True False之间的区别
Jul 09 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数组的维度
2013/06/10 PHP
php引用传值实例详解学习
2013/11/06 PHP
php数组查找函数in_array()、array_search()、array_key_exists()使用实例
2014/04/29 PHP
Yii框架数据模型的验证规则rules()被执行的方法
2016/12/02 PHP
php中简单的对称加密算法实现
2017/01/05 PHP
实例讲解PHP表单验证功能
2019/02/15 PHP
ThinkPHP框架整合微信支付之Native 扫码支付模式二图文详解
2019/04/09 PHP
PHP使用DOM对XML解析处理操作示例
2019/07/04 PHP
php获取是星期几的的一些常用姿势
2019/12/15 PHP
Nigma vs AM BO3 第一场2.13
2021/03/10 DOTA
JSChart轻量级图形报表工具(内置函数中文参考)
2010/10/11 Javascript
javascript 进阶篇1 正则表达式,cookie管理,userData
2012/03/14 Javascript
向当前style sheet中插入一个新的style实现方法
2013/04/01 Javascript
url参数中有+、空格、=、%、&amp;、#等特殊符号的问题解决
2013/05/15 Javascript
JavaScript面向对象编程入门教程
2014/04/16 Javascript
js识别不同浏览器基于userAgent做判断
2014/07/29 Javascript
JavaScript Window浏览器对象模型方法与属性汇总
2015/04/20 Javascript
JS仿百度自动下拉框模糊匹配提示
2016/07/25 Javascript
gulp加批处理(.bat)实现ng多应用一键自动化构建
2017/02/16 Javascript
layui--select使用以及下拉框实现键盘选择的例子
2019/09/24 Javascript
解决layer 关闭当前弹窗 关闭遮罩层 input值获取不到的问题
2019/09/25 Javascript
jdk1.8+vue elementui实现多级菜单功能
2020/09/24 Javascript
[01:01]青春无憾,一战成名——DOTA2全国高校联赛开启
2018/02/25 DOTA
11个并不被常用但对开发非常有帮助的Python库
2015/03/31 Python
python实现pdf转换成word/txt纯文本文件
2018/06/07 Python
学Python 3的理由和必要性
2019/11/19 Python
pytorch之添加BN的实现
2020/01/06 Python
Python爬虫获取页面所有URL链接过程详解
2020/06/04 Python
CSS3 rgb and rgba(透明色)的使用详解
2020/09/25 HTML / CSS
奥地利体育网上商店:Gigasport
2019/10/09 全球购物
课外小组活动总结
2014/08/27 职场文书
廉政党课工作报告案例
2019/06/21 职场文书
经典格言警句:没有热忱,世间便无进步
2019/11/13 职场文书
vue backtop组件的实现完整代码
2021/04/07 Vue.js
关于mysql中时间日期类型和字符串类型的选择
2021/11/27 MySQL
win10双系统怎么删除一个系统?win10电脑有两个系统删除一个的操作方法
2022/07/15 数码科技