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完全新手教程
Feb 08 Python
测试、预发布后用python检测网页是否有日常链接
Jun 03 Python
举例讲解Python设计模式编程中的访问者与观察者模式
Jan 26 Python
详解python里使用正则表达式的分组命名方式
Oct 24 Python
Python3简单实例计算同花的概率代码
Dec 06 Python
python生成不重复随机数和对list乱序的解决方法
Apr 09 Python
Python实现获取邮箱内容并解析的方法示例
Jun 16 Python
十分钟搞定pandas(入门教程)
Jun 21 Python
python实现图像检索的三种(直方图/OpenCV/哈希法)
Aug 08 Python
python3中sys.argv的实例用法
Apr 24 Python
Pycharm激活方法及详细教程(详细且实用)
May 12 Python
virtualenv介绍及简明教程
Jun 23 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 strtotime函数详解
2009/12/18 PHP
ThinkPHP的I方法使用详解
2014/06/18 PHP
PHP图像裁剪缩略裁切类源码及使用方法
2016/01/07 PHP
PHP加密技术的简单实现
2016/09/04 PHP
PHP创建自己的Composer包方法
2018/04/09 PHP
使用PHP开发留言板功能
2019/11/19 PHP
IE DOM实现存在的部分问题及解决方法
2009/07/25 Javascript
JS 事件绑定函数代码
2010/04/28 Javascript
js操作textarea方法集合封装(兼容IE,firefox)
2011/02/22 Javascript
在Firefox下js select标签点击无法弹出
2014/03/06 Javascript
from表单多个按钮提交用onclick跳转不同action
2014/04/24 Javascript
js实现黑色简易的滑动门网页tab选项卡效果
2015/08/31 Javascript
Highcharts 多个Y轴动态刷新数据的实现代码
2016/05/28 Javascript
vue中for循环更改数据的实例代码(数据变化但页面数据未变)
2017/09/15 Javascript
原生JS上传大文件显示进度条 php上传文件代码
2020/03/27 Javascript
Vue2.0+ElementUI实现表格翻页的实例
2017/10/23 Javascript
layui前端框架之table表数据的刷新方法
2018/08/17 Javascript
微信小程序中的canvas 文字断行和省略号显示功能的处理方法
2018/11/14 Javascript
微信小程序用户授权、位置授权及获取微信绑定手机号
2019/07/18 Javascript
解决vue的router组件component在import时不能使用变量问题
2020/07/26 Javascript
[04:59]2018DOTA2亚洲邀请赛 4.7 Mineski夺冠时刻
2018/04/09 DOTA
压缩包密码破解示例分享(类似典破解)
2014/01/17 Python
Python不规范的日期字符串处理类
2014/06/10 Python
python中pycurl库的用法实例
2014/09/30 Python
简单谈谈Python中的几种常见的数据类型
2017/02/10 Python
Python 打印中文字符的三种方法
2018/08/14 Python
python将一个英文语句以单词为单位逆序排放的方法
2018/12/20 Python
利用Python实现微信找房机器人实例教程
2019/03/10 Python
如何基于python实现归一化处理
2020/01/20 Python
H&M美国官网:欧洲最大的服饰零售商
2016/09/07 全球购物
英国工具中心:UK Tool Centre
2017/07/10 全球购物
2015年挂职锻炼工作总结
2014/12/12 职场文书
画展邀请函
2015/01/31 职场文书
使用PDF.js渲染canvas实现预览pdf的效果示例
2021/04/17 Javascript
解决Vue+SpringBoot+Shiro跨域问题
2021/06/09 Vue.js
Python使用plt.boxplot()函数绘制箱图、常用方法以及含义详解
2022/08/14 Python