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中PDB模块中的命令来调试Python代码的教程
Mar 30 Python
Python中SOAP项目的介绍及其在web开发中的应用
Apr 14 Python
python模拟enum枚举类型的方法小结
Apr 30 Python
使用python编写简单的小程序编译成exe跑在win10上
Jan 15 Python
Python实现PS滤镜的旋转模糊功能示例
Jan 20 Python
Python实现接受任意个数参数的函数方法
Apr 21 Python
Python简单实现网页内容抓取功能示例
Jun 07 Python
使用urllib库的urlretrieve()方法下载网络文件到本地的方法
Dec 19 Python
pycharm new project变成灰色的解决方法
Jun 27 Python
Flask配置Cors跨域的实现
Jul 12 Python
如何对python的字典进行排序
Jun 19 Python
python基础入门之普通操作与函数(三)
Jun 13 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验证码类代码( 最新修改,完全定制化! )
2010/12/02 PHP
PHP命名空间(Namespace)的使用详解
2013/05/04 PHP
深入php中var_dump方法的使用详解
2013/06/24 PHP
PHP加密扩展库Mcrypt安装和实例
2013/11/10 PHP
PHP采用get获取url汉字出现乱码的解决方法
2014/11/13 PHP
php常用文件操作函数汇总
2014/11/22 PHP
ThinkPHP中获取指定日期后工作日的具体日期方法
2018/10/14 PHP
PHP常用字符串输出方法分析(echo,print,printf及sprintf)
2021/03/09 PHP
写的htc的数据表格
2007/01/20 Javascript
Cookie 注入是怎样产生的
2009/04/08 Javascript
javascript 语法基础 想学习js的朋友可以看看
2009/12/16 Javascript
关于文本框的一些限制控制总结~~
2010/04/15 Javascript
jQuery Validation实例代码 让验证变得如此容易
2010/10/18 Javascript
将HTMLCollection/NodeList/伪数组转换成数组的实现方法
2011/06/20 Javascript
javascript自然分类法算法实现代码
2013/10/11 Javascript
鼠标滑过出现预览的大图提示效果
2014/02/26 Javascript
jquery处理json数据实例分析
2014/06/03 Javascript
Angularjs 基础入门
2014/12/26 Javascript
AngularJS学习笔记(三)数据双向绑定的简单实例
2016/11/08 Javascript
BootStrap栅格系统、表单样式与按钮样式源码解析
2017/01/20 Javascript
详解闭包解决jQuery中AJAX的外部变量问题
2017/02/22 Javascript
jQuery插件HighCharts绘制2D带Label的折线图效果示例【附demo源码下载】
2017/03/08 Javascript
javaScript canvas实现(画笔大小 颜色 橡皮的实例)
2017/11/28 Javascript
浅谈React前后端同构防止重复渲染
2018/01/05 Javascript
解决vue 打包发布去#和页面空白的问题
2018/09/04 Javascript
JavaScript中的垃圾回收与内存泄漏示例详解
2019/05/02 Javascript
详解Python读取配置文件模块ConfigParser
2017/05/11 Python
tensorflow识别自己手写数字
2018/03/14 Python
对numpy和pandas中数组的合并和拆分详解
2018/04/11 Python
django 实现编写控制登录和访问权限控制的中间件方法
2019/01/15 Python
Python脚本导出为exe程序的方法
2020/03/25 Python
浅谈python 中的 type(), dtype(), astype()的区别
2020/04/09 Python
Python实现捕获异常发生的文件和具体行数
2020/04/25 Python
Levi’s西班牙官方网站:李维斯,著名的牛仔裤品牌
2020/08/20 全球购物
与C++相比,Java中的数组有什么不同
2014/03/25 面试题
家具厂厂长岗位职责
2014/01/01 职场文书