服务端

! /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文件的上传与下载)简单版本的更多相关文章

  1. java实现ftp文件的上传与下载

    最近在做ftp文件的上传与下载,基于此,整理了一下资料.本来想采用java自带的方法,可是看了一下jdk1.6与1.7的实现方法有点区别,于是采用了Apache下的框架实现的... 1.首先引用3个包 ...

  2. 黏包-黏包的成因、解决方式及struct模块初识、文件的上传和下载

    黏包: 同时执行多条命令之后,得到的结果很可能只有一部分,在执行其他命令的时候又接收到之前执行的另外一部分结果,这种显现就是黏包. 只有TCP协议中才会产生黏包,UDP协议中不会有黏包(udp协议中数 ...

  3. C#实现FTP文件的上传、下载功能、新建目录以及文件的删除

    本来这篇博文应该在上周就完成的,可无奈,最近工作比较忙,没有时间写,所以推迟到了今天.可悲的是,今天也没有太多的时间,所以决定给大家贴出源码,不做详细的分析说明,如果有不懂的,可以给我留言,我们共同讨 ...

  4. Python实现FTP文件的上传和下载

    # coding: utf-8 import os from ftplib import FTP def ftp_connect(host, username, password): ftp = FT ...

  5. python使用ftplib模块实现FTP文件的上传下载

    python已经默认安装了ftplib模块,用其中的FTP类可以实现FTP文件的上传下载 FTP文件上传下载 # coding:utf8 from ftplib import FTP def uplo ...

  6. Python 进行 SSH 操作,实现本地与服务器的链接,进行文件的上传和下载

    Python 进行 SSH 操作,实现本地与服务器的链接,进行文件的上传和下载 2018年5月26日 19:03 阅读 375 评论 7 我本地和服务器的连接一直使用的是 Xshell 5,而在与服务 ...

  7. 通过JMeter来测试Quick Easy FTP Server的上传与下载性能

    FTP性能测试 1.1背景说明 本测试选用的是一个小型的FTP服务器软件:Quick Easy FTP Server.Quick Easy FTP Server是一个全中文的FTP服务器软件,反应迅速 ...

  8. python 解决粘包问题

    客户端发送hello,如果服务端 recv(1) ,那只能接收到 h 这一个字符,然后再recv(1) 一下,可以再接收一个 e , 因为客户端发送的结果长,所以只能把其他的先缓存下来,下次recv的 ...

  9. ftp链接、上传、下载、断开

    开发环境:Jdk 1.8 引入第三方库:commons-net-2.2.jar(针对第一种方法) 一.基于第三方库FtpClient的FTP服务器数据传输 由于是基于第三方库,所以这里基本上没有太多要 ...

随机推荐

  1. [LeetCode] 552. Student Attendance Record II 学生出勤记录之二

    Given a positive integer n, return the number of all possible attendance records with length n, whic ...

  2. [LeetCode] 457. Circular Array Loop 环形数组循环

    You are given a circular array nums of positive and negative integers. If a number k at an index is ...

  3. 初探Java设计模式5:一文了解Spring涉及到的9种设计模式

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  4. pytorch 查看中间变量的梯度

    pytorch 为了节省显存,在反向传播的过程中只针对计算图中的叶子结点(leaf variable)保留了梯度值(gradient).但对于开发者来说,有时我们希望探测某些中间变量(intermed ...

  5. Shell~echo -e 颜色输出

    echo -e 可以控制字体颜色和背景颜色输出 从一个例子开始: # echo -e "\e[1;33;41m test content \e[0m" 输出效果: . \e 转义起 ...

  6. layui排序功能

    后台常用功能之排序!!! 一次只能排一个序!!! 基本样式 <tr> <th>序号<span class="layui-table-sort layui-inl ...

  7. CentOS升级Python2.6到Python2.7并安装pip[转载]

    貌似CentOS 6.X系统默认安装的Python都是2.6版本的?平时使用以及很多的库都是要求用到2.7版本或以上,所以新系统要做的第一件事必不可少就是升级Python啦!在这里做个简单的升级操作记 ...

  8. Jenkins整合SonarQube

    一.概述 安装SonarQube,参考链接: https://www.cnblogs.com/xiao987334176/p/12011623.html 安装SonarQube Scanner,参考链 ...

  9. windows环境下 mysql 忘记root密码时的解决办法

    1,停止MYSQL服务,CMD打开DOS窗口,输入 net stop mysql 2,在CMD命令行窗口,进入MYSQL安装目录 比如E:\Program Files\MySQL\MySQL Serv ...

  10. SCCM+WSUS的方式分发补丁

    简单来说,System Center Configuration Manager(SCCM/ConfigMgr)由SMS(Systems Management Server)发展而来,其作为一款针对企 ...