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入门及进阶笔记 Python 内置函数小结
Aug 09 Python
python批量提交沙箱问题实例
Oct 08 Python
Python中用pycurl监控http响应时间脚本分享
Feb 02 Python
Python实现栈的方法
May 26 Python
对python中return和print的一些理解
Aug 18 Python
tensorflow1.0学习之模型的保存与恢复(Saver)
Apr 23 Python
python重试装饰器的简单实现方法
Jan 31 Python
浅析python 中大括号中括号小括号的区分
Jul 29 Python
Python requests设置代理的方法步骤
Feb 23 Python
Python使用cn2an实现中文数字与阿拉伯数字的相互转换
Mar 02 Python
解决PDF 转图片时丢文字的一种可能方式
Mar 04 Python
详解用Python把PDF转为Word方法总结
Apr 27 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
人尽可用的Windows技巧小贴士之下篇
2007/03/22 PHP
snoopy PHP版的网络客户端提供本地下载
2008/04/15 PHP
PHP+MySQL 手工注入语句大全 推荐
2009/10/30 PHP
使用Zttp简化Guzzle 调用
2017/07/02 PHP
phpstudy2018升级MySQL5.5为5.7教程(图文)
2018/10/24 PHP
javascript 建设银行登陆键盘
2008/06/10 Javascript
jquery $.ajax各个事件执行顺序
2010/10/15 Javascript
Javascript中找到子元素在父元素内相对位置的代码
2012/07/21 Javascript
使用 Node.js 做 Function Test实现方法
2013/10/25 Javascript
javascript常用函数归纳整理
2014/10/31 Javascript
JavaScript 学习笔记之数据类型
2015/01/14 Javascript
深入理解JavaScript系列(34):设计模式之命令模式详解
2015/03/03 Javascript
javascript原生ajax写法分享
2016/04/10 Javascript
js简单倒计时实现代码
2016/04/30 Javascript
jquery实现全选和全不选功能效果的实现代码【推荐】
2016/05/05 Javascript
使用bootstrap3开发响应式网站
2016/05/12 Javascript
jQuery使用$.extend(true,object1, object2);实现深拷贝对象的方法分析
2019/03/06 jQuery
JavaScript实现公告栏上下滚动效果
2020/03/13 Javascript
小程序实现上传视频功能
2020/08/18 Javascript
[38:44]DOTA2上海特级锦标赛A组小组赛#2 Secret VS CDEC第二局
2016/02/25 DOTA
Python文件与文件夹常见基本操作总结
2016/09/19 Python
利用python和ffmpeg 批量将其他图片转换为.yuv格式的方法
2019/01/08 Python
Python Pandas中根据列的值选取多行数据
2019/07/08 Python
在django中自定义字段Field详解
2019/12/03 Python
python实现飞行棋游戏
2020/02/05 Python
Python如何合并多个字典或映射
2020/07/24 Python
vue.js刷新当前页面的实例讲解
2020/12/29 Python
美国皮靴公司自1863年:The Frye Company
2016/11/30 全球购物
丹麦优惠购物网站:PLUSSHOP
2019/03/24 全球购物
学前教育专业毕业生自荐信
2013/10/03 职场文书
网管求职信
2014/03/03 职场文书
新闻专业毕业生求职信
2014/08/08 职场文书
家长学校培训材料
2014/08/20 职场文书
毕业论文答辩开场白和答辩技巧
2015/05/27 职场文书
求职信:求职应该注意的问题
2019/04/24 职场文书
导游词之金鞭溪风景区
2019/09/12 职场文书