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服务器数据传输 由于是基于第三方库,所以这里基本上没有太多要 ...
随机推荐
- [LeetCode] 314. Binary Tree Vertical Order Traversal 二叉树的竖直遍历
Given a binary tree, return the vertical order traversal of its nodes' values. (ie, from top to bott ...
- github 白嫖记(一)
位运算 按位操作符:0或者1之间的运算 a|b 或 任意一个为1结果为1 console.log(0 | 1) //1 console.log(1 | 0) //1 console.log(1 | 1 ...
- skywalking集群部署
1.需求:有两台服务器分别装了app,对这些app进行性能监控 三台服务器:10.10.20.198作为服务端展示性能数据,10.10.20.64客户端,装btam系统,10.10.20.63客户端装 ...
- Sitecore 十大优秀功能
为客户的需求创建最佳解决方案是我们的主要目标.良好的设计不仅仅是视觉吸引力,还要确保用户体验简单直观.在设计Sitecore网站时,我们始终牢记这一点 . 以下是一些我最喜欢的功能,可以帮助我们使用 ...
- jsplumb 初识
Jsplumb官网:https://jsplumbtoolkit.com GitHub:https://github.com/sporritt/jsplumb/ 有很多官网示例 基础教程:htt ...
- IEEE Fellow 何海波
IEEE Fellow 何海波 11月21日,全球最大的非营利专业技术学会IEEE(电气与电子工程师协会)公布了2018年度新当选Fellow(会士)名单,我校校友何海波教授入选. 何海波,美国罗德岛 ...
- 查看索引在哪些ES集群节点上的命令
用途:迁移数据到其他节点上的时候需要用这个 GET /_cat/shards GET /_cat/shards?h=n
- XmlExtensions帮助类
public static class XmlExtensions { static Lazy<XmlWriterSettings> _settings = new Lazy<Xml ...
- 微信小程序主要开发语言
小程序的主要开发语言是 JavaScript ,开发者使用 JavaScript 来开发业务逻辑以及调用小程序的 API 来完成业务需求. 在大部分开发者看来,ECMAScript和JavaScrip ...
- .net core 加载项目提示项目文件不完整,dotnet提示不是内部或外部命令
记录一下 在系统环境变量中PATH添加如下: C:\Windows;C:\Windows\System32\System32\Wbem;C:\Windows\System32;