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实现端口复用实例代码
Jul 03 Python
在Python的Django框架中获取单个对象数据的简单方法
Jul 17 Python
python读取视频流提取视频帧的两种方法
Oct 22 Python
Python实现去除列表中重复元素的方法小结【4种方法】
Apr 27 Python
浅谈Python里面小数点精度的控制
Jul 16 Python
Django框架封装外部函数示例
May 28 Python
使用python爬取微博数据打造一颗“心”
Jun 28 Python
对python中url参数编码与解码的实例详解
Jul 25 Python
python实现简单成绩录入系统
Sep 19 Python
python爬虫构建代理ip池抓取数据库的示例代码
Sep 22 Python
用 python 进行微信好友信息分析
Nov 28 Python
python 利用jieba.analyse进行 关键词提取
Dec 17 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简单命令代码集锦
2007/09/24 PHP
实用函数5
2007/11/08 PHP
关于页面优化和伪静态
2009/10/11 PHP
php数字转汉字代码(算法)
2011/10/08 PHP
PHP解压ZIP文件到指定文件夹的方法
2016/11/17 PHP
JS BASE64编码 window.atob(), window.btoa()
2021/03/09 Javascript
XHTML-Strict 内允许出现的标签
2006/12/11 Javascript
JS实现鼠标经过好友列表中的好友头像时显示资料卡的效果
2014/07/02 Javascript
jquery实现鼠标悬浮停止轮播特效
2020/08/20 Javascript
jQuery插件支持同一页面被多次调用
2016/02/14 Javascript
基于JS实现回到页面顶部的五种写法(从实现到增强)
2016/09/03 Javascript
原生js实现淘宝购物车功能
2020/06/23 Javascript
Vue2.0基于vue-cli+webpack同级组件之间的通信教程(推荐)
2017/09/14 Javascript
layui中layer前端组件实现图片显示功能的方法分析
2017/10/13 Javascript
nodejs操作mongodb的增删改查功能实例
2017/11/09 NodeJs
JS中数据结构之栈
2019/01/01 Javascript
基于vue实现一个禅道主页拖拽效果
2019/05/27 Javascript
Vue 请求传公共参数的操作
2020/07/31 Javascript
在webstorm中配置less的方法详解
2020/09/25 Javascript
[14:36]2014 DOTA2国际邀请赛中国区预选赛5.21 Orenda VS NE
2014/05/22 DOTA
Python实例分享:快速查找出被挂马的文件
2014/06/08 Python
在Python的web框架中中编写日志列表的教程
2015/04/30 Python
centos 安装python3.6环境并配置虚拟环境的详细教程
2018/02/22 Python
python3转换code128条形码的方法
2019/04/17 Python
对python3 sort sorted 函数的应用详解
2019/06/27 Python
获取python运行输出的数据并解析存为dataFrame实例
2020/07/07 Python
俄罗斯建筑和装饰材料在线商店:Stroilandia
2020/07/25 全球购物
酒店保洁主管岗位职责
2013/11/28 职场文书
巾帼建功标兵事迹材料
2014/05/11 职场文书
公司活动总结怎么写
2014/06/25 职场文书
2014年路政工作总结
2014/12/10 职场文书
明星邀请函
2015/02/02 职场文书
2015年世界环境日活动总结
2015/02/11 职场文书
2016寒假假期总结
2015/10/10 职场文书
检讨书范文
2019/04/16 职场文书
vue判断按钮是否可以点击
2022/04/09 Vue.js