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实现ftp客户端示例分享
Feb 17 Python
Python中使用插入排序算法的简单分析与代码示例
May 04 Python
python中利用Future对象回调别的函数示例代码
Sep 07 Python
很酷的python表白工具 你喜欢我吗
Apr 11 Python
python基于paramiko将文件上传到服务器代码实现
Jul 08 Python
基于pygame实现童年掌机打砖块游戏
Feb 25 Python
pandas中ix的使用详细讲解
Mar 09 Python
PyQt5 如何让界面和逻辑分离的方法
Mar 24 Python
Mysql数据库反向生成Django里面的models指令方式
May 18 Python
pycharm 添加解释器的方法步骤
Aug 31 Python
Python计算矩阵的和积的实例详解
Sep 10 Python
Python Web项目Cherrypy使用方法镜像
Nov 05 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
我的论坛源代码(五)
2006/10/09 PHP
php处理restful请求的路由类分享
2014/02/27 PHP
PHP+JavaScript实现无刷新上传图片
2017/02/21 PHP
原生JS实现Ajax通过GET方式与PHP进行交互操作示例
2018/05/12 PHP
PHP chunk_split()函数讲解
2019/02/12 PHP
ThinkPHP 5.x远程命令执行漏洞复现
2019/09/23 PHP
基于jquery的防止大图片撑破页面的实现代码(立即缩放)
2011/10/24 Javascript
Node.js开发指南中的简单实例(mysql版)
2013/09/17 Javascript
avascript中的自执行匿名函数应用示例
2014/09/15 Javascript
jQuery使用之处理页面元素用法实例
2015/01/19 Javascript
Javascript vue.js表格分页,ajax异步加载数据
2016/10/24 Javascript
浅谈js对象属性 通过点(.) 和方括号([]) 的不同之处
2016/10/29 Javascript
Node.js设置CORS跨域请求中多域名白名单的方法
2017/03/28 Javascript
jquery.masonry瀑布流效果
2017/05/25 jQuery
jQuery实现倒计时功能 jQuery实现计时器功能
2017/09/19 jQuery
Node层模拟实现multipart表单的文件上传示例
2018/01/02 Javascript
不到200行 JavaScript 代码实现富文本编辑器的方法
2018/01/03 Javascript
javascript闭包的使用之按钮切换功能
2018/08/30 Javascript
浅谈微信小程序flex布局基础
2018/09/10 Javascript
详解vue开发中调用微信jssdk的问题
2019/04/16 Javascript
JS浏览器BOM常见操作实例详解
2020/04/27 Javascript
在vue中使用echarts(折线图的demo,markline用法)
2020/07/20 Javascript
Vue项目如何引入bootstrap、elementUI、echarts
2020/11/26 Vue.js
[00:59]DOTA2荣耀之路1:Doom is back!weapon X!
2018/05/22 DOTA
Python使用Selenium爬取淘宝异步加载的数据方法
2018/12/17 Python
pygame实现烟雨蒙蒙下彩虹雨
2019/11/11 Python
Python实现变声器功能(萝莉音御姐音)
2019/12/05 Python
HTML5新增的8类INPUT输入类型介绍
2015/07/06 HTML / CSS
Michael Kors加拿大官网:购买设计师手袋、手表、鞋子、服装等
2019/03/16 全球购物
Nasty Gal英国:美国女性服饰销售网站
2021/03/02 全球购物
校园招聘策划书
2014/01/09 职场文书
关于运动会的广播稿
2014/09/22 职场文书
群众路线剖析材料(四风问题)
2014/10/08 职场文书
工伤死亡理赔协议书
2014/10/20 职场文书
python通过函数名调用函数的几种方法总结
2021/06/07 Python
win10如何开启ahci模式?win10开启ahci模式详细操作教程
2022/07/23 数码科技