python 解决粘包问题的例子(ftp文件的上传与下载)简单版本
服务端
! /user/bin/env python3
-- coding:utf_8 --
"""
Author:Markli
# 2019/9/9,16:41
"""
import socketserver
import os, json,struct
if not os.path.isdir('ftp文件'):
os.mkdir("ftp文件")
file_list = os.listdir('ftp文件')
file_str = str(file_list)
class MyClass(socketserver.BaseRequestHandler):
def handle(self):
print(self)
while True:
# print(file_str)
try:
index = self.request.recv(1024).decode('utf-8')
print('请求为', index)
except:
break
if index == '1':
try:
while True:
head = self.request.recv(4)
head_json_len = struct.unpack('i', head)[0]
data = self.request.recv(head_json_len).decode('utf-8')
head_json = json.loads(data)
file_name = head_json['file_name']
print(file_name)
file_len = head_json['data_size']
count = 0
data_file = b''
while count < file_len:
if file_len < 1024:
data = self.request.recv(file_len)
else:
if file_len - count >= 1024:
data = self.request.recv(1024)
else:
data = self.request.recv(file_len - count)
data_file += data
count += len(data)
file_path = os.path.join('ftp文件', file_name)
with open(file_path, 'wb') as fw:
fw.write(data_file)
print(f"{self.client_address}上传{file_name}成功")
except:
break
elif index == '2':
try:
while True:
self.request.send(file_str.encode())
index = self.request.recv(4).decode()
index = int(index)
file_name = file_list[index]
file_path = os.path.join('ftp文件', file_list[index])
with open(file_path, 'rb') as f:
data = f.read()
headers = {'data_size': len(data), 'file_name': file_name}
head_json = json.dumps(headers)
head_json_bytes = bytes(head_json, encoding='utf-8')
self.request.send(struct.pack('i', len(head_json_bytes)))
self.request.send(head_json_bytes)
self.request.send(data)
except:
break
else:
continue
if name == 'main':
socket = socketserver.ThreadingTCPServer(('172.0.0.1',8080),MyClass)
socket.serve_forever()
客户端
! /user/bin/env python3
-- coding:utf_8 --
"""
Author:Markli
# 2019/9/9,16:41
"""
import socket
import os,struct,json
client = socket.socket()
client.connect(('172.0.0.1',8080))
func_dic = {
'1':'upper',
'2':'load'
}
if not os.path.isdir('my'):
os.mkdir('my')
file_list = os.listdir('my')
file_str = str(file_list)
while True:
for key, Value in func_dic.items():
print(key, Value)
choice_func = input("请选择你需要的功能")
client.send(choice_func.encode('utf-8'))
if choice_func == 'q':
break
# choice_func = int(choice_func)
# if func_dic.get(choice_func):
if choice_func == '1':
while True:
for index, file in enumerate(file_list):
print(index, file)
choice_file = input("请输入你要上传的文件编号")
choice_file = int(choice_file)
file_name = file_list[choice_file]
print(file_name)
file_path = os.path.join('my', file_name)
with open(file_path, 'rb') as fr:
data = fr.read()
headers = {'data_size': len(data), 'file_name': file_name}
print(headers['data_size'])
head_json = json.dumps(headers)
head_json_bytes = bytes(head_json, encoding='utf-8')
client.send(struct.pack('i', len(head_json_bytes)))
client.send(head_json_bytes)
client.send(data)
print(f"上传{file_name}成功")
if choice_func == '2':
while True:
choice_func = int(choice_func)
data = client.recv(1024).decode()
data = eval(data)
file_list = list(data)
for index, file in enumerate(file_list):
print(index, file)
choice = input("请选择你要下载的文件编号")
client.send(choice.encode())
head = client.recv(4)
head_json_len = struct.unpack('i', head)[0]
data = client.recv(head_json_len).decode('utf-8')
head_json = json.loads(data)
file_name = head_json['file_name']
file_len = head_json['data_size']
count = 0
data_file = b''
while count < file_len:
if file_len < 1024:
data = client.recv(file_len)
else:
if file_len - count >= 1024:
data = client.recv(1024)
else:
data = client.recv(file_len - count)
data_file += data
count += len(data)
file_name = os.path.join('my', file_name)
with open(file_name, 'wb') as fw:
fw.write(data_file)
print(f'{file_name}下载成功')
client.close()
python 解决粘包问题的例子(ftp文件的上传与下载)简单版本的更多相关文章
- java实现ftp文件的上传与下载
最近在做ftp文件的上传与下载,基于此,整理了一下资料.本来想采用java自带的方法,可是看了一下jdk1.6与1.7的实现方法有点区别,于是采用了Apache下的框架实现的... 1.首先引用3个包 ...
- 黏包-黏包的成因、解决方式及struct模块初识、文件的上传和下载
黏包: 同时执行多条命令之后,得到的结果很可能只有一部分,在执行其他命令的时候又接收到之前执行的另外一部分结果,这种显现就是黏包. 只有TCP协议中才会产生黏包,UDP协议中不会有黏包(udp协议中数 ...
- C#实现FTP文件的上传、下载功能、新建目录以及文件的删除
本来这篇博文应该在上周就完成的,可无奈,最近工作比较忙,没有时间写,所以推迟到了今天.可悲的是,今天也没有太多的时间,所以决定给大家贴出源码,不做详细的分析说明,如果有不懂的,可以给我留言,我们共同讨 ...
- Python实现FTP文件的上传和下载
# coding: utf-8 import os from ftplib import FTP def ftp_connect(host, username, password): ftp = FT ...
- python使用ftplib模块实现FTP文件的上传下载
python已经默认安装了ftplib模块,用其中的FTP类可以实现FTP文件的上传下载 FTP文件上传下载 # coding:utf8 from ftplib import FTP def uplo ...
- Python 进行 SSH 操作,实现本地与服务器的链接,进行文件的上传和下载
Python 进行 SSH 操作,实现本地与服务器的链接,进行文件的上传和下载 2018年5月26日 19:03 阅读 375 评论 7 我本地和服务器的连接一直使用的是 Xshell 5,而在与服务 ...
- 通过JMeter来测试Quick Easy FTP Server的上传与下载性能
FTP性能测试 1.1背景说明 本测试选用的是一个小型的FTP服务器软件:Quick Easy FTP Server.Quick Easy FTP Server是一个全中文的FTP服务器软件,反应迅速 ...
- python 解决粘包问题
客户端发送hello,如果服务端 recv(1) ,那只能接收到 h 这一个字符,然后再recv(1) 一下,可以再接收一个 e , 因为客户端发送的结果长,所以只能把其他的先缓存下来,下次recv的 ...
- ftp链接、上传、下载、断开
开发环境:Jdk 1.8 引入第三方库:commons-net-2.2.jar(针对第一种方法) 一.基于第三方库FtpClient的FTP服务器数据传输 由于是基于第三方库,所以这里基本上没有太多要 ...
随机推荐
- thinkphp5.1 - twig使用
thinkphp5.1 - twig使用1.安装按照:https://github.com/yunwuxin/think-twigTwig Template For ThinkPHP5 安装 comp ...
- oracle--10GRAC集群(NFS共享存储)
一,NFS服务器配置 01, 安装包查看 [root@standby2 ~]# rpm -qa|grep nfs nfs-utils-lib--.el6.x86_64 nfs4-acl-tools-- ...
- python使用rdflib创建rdf,在jena fuseki上执行SPARQL查询
建立并启动jena fuseki服务 参考:https://www.cnblogs.com/bincoding/p/11223372.html 使用rdflib创建rdf文件 import rdfli ...
- Elasticsearch由浅入深(十一)内核原理
倒排索引组成结构以及索引不可变原因 对于倒排索引是非常适合用来进行搜索的它的结构:(1)包含这个关键词的document list(2)包含这个关键词的所有document的数量:IDF(invers ...
- 主流的单元测试工具之-JAVA新特性-Annotation
1:什么是Annotation?Annotation,即“@xxx”(如@Before,@After,@Test(timeout=xxx),@ignore),这个单词一般是翻译成元数据,是JAVA的一 ...
- 【网络知识之五】TCP
TCP协议:传输控制协议. 一.TCP保证可靠性的机制1.校验和 TCP报头有16位检验和: 由发送端填充, 检验形式有CRC校验等. 如果接收端校验不通过, 则认为数据有问题. 此处的校验和不光包含 ...
- linux 开启oracle监听
secureCRT连接到数据库所在的linux机器,切换到oracle用户模式下 [root@nstlbeta ~]# su - oracle 步骤阅读 2 然后用sqlplus登录到数据库,关闭数据 ...
- [转帖]CHROME开发者工具的小技巧
CHROME开发者工具的小技巧 https://coolshell.cn/articles/17634.html 需要仔细学习看一看呢. 2017年01月19日 陈皓 评论 58 条评论 64,08 ...
- Ubuntu19 安装 pylearn2
环境: /etc/issue # Ubuntu 19.10 \n \l python -V # Python 其中,python环境是我自己建立的虚拟 venv 方便测试( 相当于你的python 实 ...
- 基于 HTML5 WebGL 的 3D 智慧隧道漫游巡检
前言 这次为大家展示的是通过 HT for Web 灵活的图型化编辑工具打造的智慧隧道监控系统.通过 HTML5 技术实现了桌面和移动端的跨平台性,同时现实了可视化运维. 这次主要跟大家分享里面的漫游 ...