服务端

! /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] 410. Split Array Largest Sum 分割数组的最大值

    Given an array which consists of non-negative integers and an integer m, you can split the array int ...

  2. [LeetCode] 187. Repeated DNA Sequences 求重复的DNA序列

    All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: "ACG ...

  3. 1,[VS入门教程] 使用Visual Studio写c语言 入门与技巧精品文~~~~下载安装篇

    Microsoft Visual Studio是微软(俗称巨硬)公司出品的强大IDE(Integrated Development Environment 集成开发环境),功能强大齐全,界面舒服之类的 ...

  4. SpringBoot集成Spring Security(4)——自定义表单登录

    通过前面三篇文章,你应该大致了解了 Spring Security 的流程.你应该发现了,真正的 login 请求是由 Spring Security 帮我们处理的,那么我们如何实现自定义表单登录呢, ...

  5. k8s之系统组件架构-02

    k8s系统架构图 网络组件:calico+kube-proxy(IPVS) 网络暴露:traefik+ingress,分别对HTTP与TCP的服务暴露 存储:glusterfs(heketi管理) 日 ...

  6. Linux查看系统基本信息,版本信息(最全版)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/qq_31278903/article/d ...

  7. python 爬取媒体文件(无防火墙)

    #coding = utf-8 import requests import pandas as pd import os,time root_path = './根目录/' input_file = ...

  8. 错误:error: failed to push some refs to 'https://github.com/pzq7025/KG.git'的解决办法

    一.问题在进行[git push orgin master]的时候出现如下错误 ! [rejected] master -> master (non-fast-forward) error: f ...

  9. Mysql系列(十二)—— 索引下推优化

    索引条件下推(ICP)是对MySQL使用索引从表中检索行的情况的优化.如果没有ICP,存储引擎会遍历索引以查找基表中的行,并将它们返回给MySQL服务器,该服务器会评估WHERE行的条件.启用ICP后 ...

  10. 【spring boot】加载同名Bean解决方法

    原文地址:https://blog.csdn.net/liuyueyi25/article/details/83280239 @SpringBootApplication @ComponentScan ...