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的Django框架下使用django-tagging的教程
May 30 Python
python直接获取API传递回来的参数方法
Dec 17 Python
python实现公司年会抽奖程序
Jan 22 Python
python程序 创建多线程过程详解
Sep 23 Python
详解Django CAS 解决方案
Oct 30 Python
Python实现AI自动抠图实例解析
Mar 05 Python
Django微信小程序后台开发教程的实现
Jun 03 Python
python退出循环的方法
Jun 18 Python
Python如何对XML 解析
Jun 28 Python
读取nii或nii.gz文件中的信息即输出图像操作
Jul 01 Python
Python用requests库爬取返回为空的解决办法
Feb 21 Python
浅谈Python numpy创建空数组的问题
May 25 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引用
2015/02/22 PHP
php基本函数汇总
2015/07/09 PHP
用javascript动态调整iframe高度的代码
2007/04/10 Javascript
js中top、clientTop、scrollTop、offsetTop的区别 文字详细说明版
2011/01/08 Javascript
图片动画横条广告带上下滚动的JS代码
2013/10/25 Javascript
关于js内存泄露的一个好例子
2013/12/09 Javascript
javascript为下拉列表动态添加数据项
2014/05/23 Javascript
JQuery Tips相关(1)----关于$.Ready()
2014/08/14 Javascript
JavaScript实现当网页加载完成后执行指定函数的方法
2015/03/21 Javascript
jquery实现横向图片轮播特效代码分享
2015/11/19 Javascript
JavaScript兼容性总结之获取非行间样式案例
2016/08/07 Javascript
原生js仿浏览器滚动条效果
2017/03/02 Javascript
详解nodejs微信公众号开发——4.自动回复各种消息
2017/04/11 NodeJs
Nodejs实现多房间简易聊天室功能
2017/06/20 NodeJs
JS中实现隐藏部分姓名或者电话号码的代码
2018/07/17 Javascript
[原创]微信小程序获取网络类型的方法示例
2019/03/01 Javascript
Vue请求java服务端并返回数据代码实例
2019/11/28 Javascript
js数组相减简单示例【删除a数组所有与b数组相同元素】
2020/03/04 Javascript
[39:52]2018DOTA2亚洲邀请赛 4.3 突围赛 EG vs Newbee 第一场
2018/04/04 DOTA
wxPython学习之主框架实例
2014/09/28 Python
python比较两个列表大小的方法
2015/07/11 Python
python+VTK环境搭建及第一个简单程序代码
2017/12/13 Python
python3+PyQt5 数据库编程--增删改实例
2019/06/17 Python
python不使用for计算两组、多个矩形两两间的iou方式
2020/01/18 Python
世界最大域名注册商:GoDaddy
2016/07/24 全球购物
美国在线家装零售商:Build.com
2016/09/02 全球购物
美国韩国化妆品和护肤品购物网站:Beautytap
2018/07/29 全球购物
The Hut英国:英国领先的豪华在线百货商店
2019/07/26 全球购物
一些Solaris面试题
2015/12/22 面试题
若干个Java基础面试题
2015/05/19 面试题
总经理助理岗位职责
2013/11/08 职场文书
学校课外活动总结
2014/05/08 职场文书
2015年党员干部承诺书
2015/01/21 职场文书
法学专业求职信范文
2015/03/19 职场文书
分析SQL窗口函数之排名窗口函数
2022/04/21 Oracle
清空 Oracle 安装记录并重新安装
2022/04/26 Oracle