怎样保证socket.recv接收完数据
最近在使用python进行网络编程开发一个通用的tcpclient测试小工具。在使用socket进行网络编程中,如何判定对端发送一条报文是否接收完成,是进行socket网络开发必须要考虑的一个问题。这里,简要介绍一下判别数据接收接收完成常用的三种方法:
1.基础数据接收法:
使用基础数据接收法时,当与服务socket断开连接时,会接收到空字符串。因此,可以根据此特点,在程序中加入循环,一直接收数据,直到数据发送端关闭socket连接。适用场景:客户端和服务器的链接为短链接(即一次socket通讯后连接就会关闭)。代码如下:

1 import socket,struct,sys,time
2
3 Port=22220
4 #assume a socket disconnect (data returned is empty string) means all data was #done being sent.
5 def recv_basic(the_socket):
6 total_data=[]
7 while True:
8 data = the_socket.recv(20480)
9 if not data: break
10 total_data.append(data)
11 return ''.join(total_data)

2.尾标识方法
通过寻找接收的协议数据中的尾标识字符串,获取完整的数据的数据报文。适用场景:接收的协议数据中包含相关的尾标识。代码如下:

1 End='something useable as an end marker'
2 def recv_end(the_socket):
3 total_data=[];data=''
4 while True:
5 data=the_socket.recv(8192)
6 if End in data:
7 total_data.append(data[:data.find(End)])
8 break
9 total_data.append(data)
10 if len(total_data)>1:
11 #check if end_of_data was split
12 last_pair=total_data[-2]+total_data[-1]
13 if End in last_pair:
14 total_data[-2]=last_pair[:last_pair.find(End)]
15 total_data.pop()
16 break
17 return ''.join(total_data)

3.负载长度方法
即通过协议数据中的负载长度值,确定有效报文的长度,适用场景:协议数据中包含负载协议字段。这种方法也是比较常用和通用的一种方法,但是需要一边接收数据一边解析数据。代码如下:

1 def recv_size(the_socket):
2 #data length is packed into 4 bytes
3 total_len=0;total_data=[];size=sys.maxint
4 size_data=sock_data='';recv_size=8192
5 while total_len<size:
6 sock_data=the_socket.recv(recv_size)
7 if not total_data:
8 if len(sock_data)>4:
9 size_data+=sock_data
10 size=struct.unpack('>i', size_data[:4])[0]
11 recv_size=size
12 if recv_size>524288:recv_size=524288
13 total_data.append(size_data[4:])
14 else:
15 size_data+=sock_data
16 else:
17 total_data.append(sock_data)
18 total_len=sum([len(i) for i in total_data ])
19 return ''.join(total_data)

怎样保证socket.recv接收完数据的更多相关文章
- Python socket ssh接收大数据
通过socket连续接收返回数据 Server服务端 import socket,os server = socket.socket() server.bind(('localhost',9999)) ...
- Python3 Tcp未发送/接收完数据即被RST处理办法
一.背景说明 昨天一个同事让帮忙写个服务,用于接收并返回他那边提交过来的数据,以便其查看提交的数据及格式是否正确. 开始想用django写个接口,但写接口接口名称就得是定死的,他那边只能向这接口提交数 ...
- 一个完整的socket recv()案例,包括解决粘包、服务器主动推数据的问题
前言: 本文是针对socket长连接(涉及到服务器主动推数据),每个包头的拼接算法和长度都不一样,具体的包头小伙伴们问自己公司的开发吧,本文只是提供思路.再啰嗦一句:recv到的包头中数字进行某种运算 ...
- Loadrunner 中socket协议RecvBuffer接收到数据长度为空
socket通讯,有两种方式,一种是建立长连接(TCP),建立后,不停的发送,接收.另外一种是建立短连接(UDP),建立连接,发送报文,接收响应,关闭连接.两种方式 server的开销不同. 今天出现 ...
- 网络编程基础【day09】:socket接收大数据(五)
本节内容 1.概述 2.socket接收大数据 3.中文字符的坑 一.概述 上篇博客写到了,就是说当服务器发送至客户端的数据,大于客户端设置的数据,则就会把数据服务端发过来的数据剩余数据存在IO缓冲区 ...
- 【python】-- Socket接收大数据
Socket接收大数据 上一篇博客中的简单ssh实例,就是说当服务器发送至客户端的数据,大于客户端设置的数据,则就会把数据服务端发过来的数据剩余数据存在IO缓冲区中,这样就会造成我们想要获取数据的完整 ...
- 网络编程 - socket接收大数据
通过socket,实现客户端发送命令,将服务端执行出的结果,反回到客户端,主要4个步骤:1.服务端返回数据: 2.服务端返回数据的大小: 3.客户端接收返回数据的大小: 4.客户端按返回数据大小接收数 ...
- 【转载】 socket recv 和 read
转自: http://blog.csdn.net/rankun1/article/details/50488989 send函数工作原理: send函数只负责将数据提交给协议层. 当调用该函数时,se ...
- Python Socket请求网站获取数据
Python Socket请求网站获取数据 ---阻塞 I/O ->收快递,快递如果不到,就干不了其他的活 ---非阻塞I/0 ->收快递,不断的去问,有没有送到,有没有送到,. ...
随机推荐
- 使用reflector对.NET反编译
reflector的下载地址:https://www.cr173.com/soft/355285.html 反编译后的结果:
- Python爬虫入门教程 9-100 河北阳光理政投诉板块
河北阳光理政投诉板块-写在前面 之前几篇文章都是在写图片相关的爬虫,今天写个留言板爬出,为另一套数据分析案例的教程做做准备,作为一个河北人,遵纪守法,有事投诉是必备的技能,那么咱看看我们大河北人都因为 ...
- ES6躬行记(12)——数组
ES6为数组添加了多个新方法,既对它的功能进行了强化,也消除了容易产生歧义的语法. 一.静态方法 1)of() ES6为Array对象新增的第一个静态方法是of(),用于创建数组,它能接收任意个参数, ...
- 预测python数据分析师的工资
前两篇博客分别对拉勾中关于 python 数据分析有关的信息进行获取(https://www.cnblogs.com/lyuzt/p/10636501.html)和对获取的数据进行可视化分析(http ...
- Spring Boot 系列总目录
一.Spring Boot 系列诞生原因 上学那会主要学的是 Java 和 .Net 两种语言,当时对于语言分类这事儿没什么概念,恰好在2009年毕业那会阴差阳错的先找到了 .Net 的工作,此后就开 ...
- 浅析MySQL 8忘记密码处理方式
对MySQL有研究的读者,可能会发现MySQL更新很快,在安装方式上,MySQL提供了两种经典安装方式:解压式和一键式,虽然是两种安装方式,但我更提倡选择解压式安装,不仅快,还干净.在操作系统上,My ...
- Flask的请求处理机制
在Flask的官方文档中是这样介绍Flask的: 对于Web应用,与客户端发送给服务器的数据交互至关重要.在Flask中由全局的request对象来提供这些信息 属性介绍 request.method ...
- docker 创建mysql镜像,并成功进行远程连接
1.安装 1.1 拉取镜像 docker pull mysql 拉取成功可以验证一下 docker images 1.2 创建并启动一个mysql容器 docker run --name ly-mys ...
- 2016年Scrum状态调查报告
背景 Scrum是一种迭代式增量软件开发过程,通常用于敏捷软件开发,包括一系列实践和预定义角色的过程骨架.Scrum由Jeff Sutherland和Ken Schwaber在一次IBM项目合作中研究 ...
- [PHP] 魔术方法__get __set __sleep __wakeup的实际使用
1.__get __set是在给不可访问属性赋值和读取时,调用 2.__sleep 是在序列化对象的时候调用 3.__wakeup是在反序列化对象的时候调用 4.可以在序列化对象的时候 , 只序列化指 ...