【python】-- Socket接收大数据
Socket接收大数据
上一篇博客中的简单ssh实例,就是说当服务器发送至客户端的数据,大于客户端设置的数据,则就会把数据服务端发过来的数据剩余数据存在IO缓冲区中,这样就会造成我们想要获取数据的完整性。
解决思路:
1、改大客户端接收的数据的大小,因为官方建议最多只能接收8k的数据,那服务端发送过来的数据很容易就会大于8K,这个思路并不能从根本上解决问题(不建议使用)
2、客户端可以多收几次,服务端给客户端发数据之前,先计算一下要发给客户端数据大小(len()判断文件长度) ,比如说要发给客户端数据是5k大小,先把5K这个值发送给客户端,客户端知道总共会接收5K的值,就知道需要接收多少次了,循环接收,直到5k数据全部接收完毕为止。
思路2逻辑流程图:
服务端代码:
import socket,os server = socket.socket()
server.bind(("localhost",9999))
server.listen(5)
while True:
conn,addr = server.accept()
print("new addr:",addr)
while True:
data = conn.recv(1024)
if not data:
print("客户端已断开")
break
print("执行指令:",data)
cmd_res = os.popen(data.decode()).read()
print("before send:",len(cmd_res))
if len(cmd_res) == 0:
cmd_res = "cmd has no output...."
conn.send( str(len(cmd_res.encode())).encode() ) #发送服务端发送给客户端数据的长度
conn.send(cmd_res.encode("utf-8")) #发送服务端的数据
print("send done")
server.close()
客户端代码:
import socket client = socket.socket()
client.connect(("localhost",9999)) while True:
cmd = input(">>>:").strip()
if len(cmd) == 0:continue
client.send(cmd.encode("utf-8"))
cmd_res_size = client.recv(1024) #接收命令的长度
print("命令结果大小:",cmd_res_size.decode())
recevied_size = 0 #接收客户端发来数据的计算器
recevied_data = b'' #客户端每次发来内容的计数器
while recevied_size < int(cmd_res_size.decode()): #当接收的数据大小 小于 客户端发来的数据
cmd_res = client.recv(1024)
recevied_size += len(cmd_res) #每次收到的服务端的数据有可能小于1024,所以必须用len判断
recevied_data += cmd_res
else:
print(recevied_data.decode("utf-8","ignore"))
print("cmd res receive done ....",recevied_size) client.close()
通过思路2写出的代码就能解决上一篇博客简单ssh实例中数据展示不完整的问题,效果图:
中文字符的坑:
通过上面代码实验后会发现客户端准备接收数据的大小会和实际数据大小不一样,实际数据要比客户端接收的数据要大,如图:
这是因为python用计算中文字符,按字符和字节算的话,长度的值是不一样的,一个 中文字符=3个字节, 如图 :
【python】-- Socket接收大数据的更多相关文章
- 网络编程基础【day09】:socket接收大数据(五)
本节内容 1.概述 2.socket接收大数据 3.中文字符的坑 一.概述 上篇博客写到了,就是说当服务器发送至客户端的数据,大于客户端设置的数据,则就会把数据服务端发过来的数据剩余数据存在IO缓冲区 ...
- 网络编程 - socket接收大数据
通过socket,实现客户端发送命令,将服务端执行出的结果,反回到客户端,主要4个步骤:1.服务端返回数据: 2.服务端返回数据的大小: 3.客户端接收返回数据的大小: 4.客户端按返回数据大小接收数 ...
- Socket接收大数据的方法
byte[] buffer = new byte[BufferSize]; int bytesRead; // 读取的字节数 MemoryStream msStream = new MemoryStr ...
- C# TCP socket发送大数据包时,接收端和发送端数据不一致 服务端接收Receive不完全
简单的c# TCP通讯(TcpListener) C# 的TCP Socket (同步方式) C# 的TCP Socket (异步方式) C# 的tcp Socket设置自定义超时时间 C# TCP ...
- 零起点PYTHON足彩大数据与机器学习实盘分析
零起点PYTHON足彩大数据与机器学习实盘分析 第1章 足彩与数据分析 1 1.1 “阿尔法狗”与足彩 1 1.2 案例1-1:可怕的英国足球 3 1.3 关于足彩的几个误区 7 1.4 足彩·大事件 ...
- 用Python实现一个大数据搜索引擎
用Python实现一个大数据搜索引擎 搜索是大数据领域里常见的需求.Splunk和ELK分别是该领域在非开源和开源领域里的领导者.本文利用很少的Python代码实现了一个基本的数据搜索功能,试图让大家 ...
- Python socket ssh接收大数据
通过socket连续接收返回数据 Server服务端 import socket,os server = socket.socket() server.bind(('localhost',9999)) ...
- socket对于大数据的发送和接收
大数据是指大于32K或者64K的数据. 大数据的发送和接收通过TSTREAM对象来进行是非常方便的. 我们把大数据分割成一个个4K大小的小包,然后再依次传输. 一.大数据的发送的类语言描述: 1)创建 ...
- python网络编程-socket发送大数据包问题
一:什么是socket大数据包发送问题 socket服务器端或者客户端在向对方发送的数据大于对方接受的缓存时,会出现第二次接受还接到上次命令发送的结果.这就出现象第一次接受结果不全,第二次接果出现第一 ...
随机推荐
- [转载]Install Opera 12.16 Web Browser in CentOS/RHEL and Fedora
FROM: http://tecadmin.net/install-opera-web-browser-in-centos-rhel-fedora/ Opera is an modern web br ...
- How to Configure an SSIS Package to Access a Web Service using WCF
This information is from:http://blogs.msdn.com/b/dbrowne/archive/2010/07/08/how-to-configure-an-ssis ...
- 四种异步更新UI的方法
Android要求只能在UI线程中更新UI,要想在其他线程中更新UI,大致有四种方式: 1.使用Handler消息传递机制(推荐)2.使用AsyncTask异步任务(推荐)3.使用runOnUiThr ...
- 重启nginx后丢失nginx.pid的解决方法(转)
一,nginx的停止操作 停止操作是通过向nginx进程发送信号来实现的.步骤1:查询nginx主进程号 ps -ef | grep nginx 在进程列表里 面找master进程,它的编号就是主进程 ...
- sort-colors——排序3种数字
题目描述 Given an array with n objects colored red, white or blue, sort them so that objects of the same ...
- jquery插件:aotocomplete
aotocomplete.js http://blog.csdn.net/smeyou/article/details/7980273?_t_t_t=0.3565731019350138 $(func ...
- java事务处理全解析
http://blog.csdn.net/huilangeliuxin/article/details/43446177
- Linux下Nagios的安装与配置(转载)
一.Nagios简介 Nagios是一款开源的电脑系统和网络监视工具,能有效监控Windows.Linux和Unix的主机状态,交换机路由器等网络设置,打印机等.在系统或服务状态异常时发出邮件或短信报 ...
- sprint3 【每日scrum】 TD助手站立会议第八天
站立会议 组员 昨天 今天 困难 签到 刘铸辉 (组长) 调整闹钟和整个项目的显示效果,最后做出了微信界面滑动的显示效果 整合原来做过的功能,并做相应的改进,整合其他的功能 在界面的设计和用户交互上始 ...
- STM32F4先设置寄存器还是先使能时钟
http://zhidao.baidu.com/link?url=gdVNuIgLOJcV37QzbCx0IrFip5pskiPQDWpoZayr_xBEe120p4d_iWtrfDl1d4tSFaH ...