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不换行之end=与逗号的意思及用途
Nov 21 Python
Python实现的选择排序算法示例
Nov 29 Python
用Python3创建httpServer的简单方法
Jun 04 Python
解决Django后台ManyToManyField显示成Object的问题
Aug 09 Python
TensorFlow索引与切片的实现方法
Nov 20 Python
利用python实现逐步回归
Feb 24 Python
python实现的分层随机抽样案例
Feb 25 Python
如何在sublime编辑器中安装python
May 20 Python
详解用Python调用百度地图正/逆地理编码API
Jul 02 Python
Python+OpenCV图像处理——图像二值化的实现
Oct 24 Python
通过实例解析python and和or使用方法
Nov 14 Python
python 网络编程要点总结
Jun 18 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
360通用php防护代码(使用操作详解)
2013/06/18 PHP
php简单实现多字节字符串翻转的方法
2015/03/31 PHP
php实现文件上传及头像预览功能
2017/01/15 PHP
Thinkphp 框架扩展之数据库驱动常用方法小结
2020/04/23 PHP
JObj预览一个JS的框架
2008/03/13 Javascript
jQuery结合PHP+MySQL实现二级联动下拉列表[实例]
2011/11/15 Javascript
js多级树形弹出一个小窗口层(非常好用)实例代码
2013/03/19 Javascript
基于javascript实现浏览器滚动条快到底部时自动加载数据
2015/11/30 Javascript
理解javascript中的with关键字
2016/02/15 Javascript
jquery点击切换背景色的简单实例
2016/08/25 Javascript
angularJs的ng-class切换class
2017/06/23 Javascript
Node.js中,在cmd界面,进入退出Node.js运行环境的方法
2018/05/12 Javascript
微信小程序实现星级评分和展示
2018/07/05 Javascript
Vue 报错TypeError: this.$set is not a function 的解决方法
2018/12/17 Javascript
原生JS与JQ获取元素的区别详解
2020/02/13 Javascript
vue webpack build资源相对路径的问题及解决方法
2020/06/04 Javascript
VUE-ElementUI 自定义Loading图操作
2020/11/11 Javascript
在HTML中使用JavaScript的两种方法
2020/12/24 Javascript
微信小程序组件生命周期的踩坑记录
2021/03/03 Javascript
python字典基本操作实例分析
2015/07/11 Python
[原创]python爬虫(入门教程、视频教程)
2018/01/08 Python
名片管理系统python版
2018/01/11 Python
python 运用Django 开发后台接口的实例
2018/12/11 Python
详解django中url路由配置及渲染方式
2019/02/25 Python
python 机器学习之支持向量机非线性回归SVR模型
2019/06/26 Python
Python图片的横坐标汉字实例
2019/12/04 Python
优质有机椰子产品:Dr. Goerg
2019/09/24 全球购物
工程概预算专业毕业生求职信
2013/10/04 职场文书
会计专业自荐信范文
2013/12/02 职场文书
服装机修工岗位职责
2013/12/26 职场文书
小学少先队活动方案
2014/02/18 职场文书
实习单位证明范例
2014/11/17 职场文书
会计工作总结范文2014
2014/12/23 职场文书
幼儿园欢迎词范文
2015/01/26 职场文书
劳动合同变更协议书范本
2019/04/18 职场文书
python批量创建变量并赋值操作
2021/06/03 Python