python socketserver 实现 ftp功能
需求:
- 用户加密认证
- 允许同时多用户登录
- 每个用户有自己的家目录 ,且只能访问自己的家目录
- 对用户进行磁盘配额,每个用户的可用空间不同
- 允许用户在ftp server上随意切换目录
- 允许用户查看当前目录下文件
- 允许上传和下载文件,保证文件一致性
- 文件传输过程中显示进度条
- 附加功能:支持文件的断点续传
client:
- #coding:utf-8
- import socket
- import json
- import os
- #client.connect(('192.168.16.200',9999))
- class FtpClient(object):
- def __init__(self):
- self.client = socket.socket()
- def help(self):
- msg = '''
- ls
- pwd
- cd ../..
- get filename
- put filename
- '''
- print(msg)
- def connect(self,ip,port):
- self.client.connect((ip, port))
- def interactive(self):
- #self.authenticate()
- while True:
- cmd = input(">>").strip()
- if len(cmd) ==0:continue
- cmd_str = cmd.split()[0]
- if hasattr(self,"cmd_%s" % cmd_str):
- func = getattr(self,"cmd_%s" % cmd_str)
- func(cmd)
- else:
- self.help()
- def cmd_put(self,*args):
- cmd_split = args[0].split()
- if len(cmd_split) >1:
- filename = cmd_split[1]
- if os.path.isfile(filename):
- filesize = os.stat(filename).st_size
- msg_dic = {
- "action": "put",
- "filename":filename,
- "size": filesize,
- "overridden":True
- }
- self.client.send( json.dumps(msg_dic).encode("utf-8") )
- print("send",json.dumps(msg_dic).encode("utf-8") )
- #防止粘包,等服务器确认
- server_response = self.client.recv(1024)
- f = open(filename,"rb")
- for line in f:
- self.client.send(line)
- else:
- print("file upload success...")
- f.close()
- else:
- print(filename,"is not exist")
- def cmd_get(self):
- pass
- ftp = FtpClient()
- ftp.connect("localhost",9999)
- ftp.interactive()
server:
- import socketserver
- import json,os
- class MyTCPHandler(socketserver.BaseRequestHandler):
- def put(self,*args):
- '''接收客户端文件'''
- cmd_dic = args[0]
- filename = cmd_dic["filename"]
- filesize = cmd_dic["size"]
- if os.path.isfile(filename):
- f = open(filename + ".new","wb")
- else:
- f = open(filename , "wb")
- self.request.send(b"200 ok")
- received_size = 0
- while received_size < filesize:
- data = self.request.recv(1024)
- f.write(data)
- received_size += len(data)
- else:
- print("file [%s] has uploaded..." % filename)
- def handle(self):
- while True:
- try:
- self.data = self.request.recv(1024).strip()
- print("{} wrote:".format(self.client_address[0]))
- print(self.data)
- cmd_dic = json.loads(self.data.decode())
- action = cmd_dic["action"]
- if hasattr(self,action):
- func = getattr(self,action)
- func(cmd_dic)
- except ConnectionResetError as e:
- print("err",e)
- break
- if __name__ == "__main__":
- HOST, PORT = "localhost", 9999
- # Create the server, binding to localhost on port 9999
- server = socketserver.ThreadingTCPServer((HOST, PORT), MyTCPHandler)
- server.serve_forever()
python socketserver 实现 ftp功能的更多相关文章
- python网络编程--socketserver 和 ftp功能简单说明
1. socketserver 我们之前写的tcp协议的socket是不是一次只能和一个客户端通信,如果用socketserver可以实现和多个客户端通信.它是在socket的基础上进行了一层封装,也 ...
- python socketserver ftp上传功能
一.socketserver用于多个客户端访问同一个服务端 客户端 import socket client = socket.socket() ip_port = ('127.0.0.1',8001 ...
- 【Python学习 】Python实现的FTP上传和下载功能
一.背景 最近公司的一些自动化操作需要使用Python来实现FTP的上传和下载功能.因此参考网上的例子,撸了一段代码来实现了该功能,下面做个记录. 二.ftplib介绍 Python中默认安装的ftp ...
- socketserver实现FTP
功能: 1.用户加密认证 2.允许同时多用户登录 3.每个用户有自己的家目录 ,且只能访问自己的家目录 4.对用户进行磁盘配额,每个用户的可用空间不同 5.允许用户在ftp server上随意切换目录 ...
- web自动化 基于python+Selenium+PHP+Ftp实现的轻量级web自动化测试框架
基于python+Selenium+PHP+Ftp实现的轻量级web自动化测试框架 by:授客 QQ:1033553122 博客:http://blog.sina.com.cn/ishou ...
- Atitit php java python nodejs错误日志功能的比较
Atitit php java python nodejs错误日志功能的比较 1.1. Php方案 自带 1 1.2. Java解决方案 SLF4J 1 1.3. Python解决方案 自带lo ...
- Python实现进度条功能
Python实现进度条功能 import sys, time def progress(percent, width=50): # 设置进度条的宽度 if percent >= 100: # 当 ...
- python之实现ftp上传下载代码(含错误处理)
# -*- coding: utf-8 -*- #python 27 #xiaodeng #python之实现ftp上传下载代码(含错误处理) #http://www.cnblogs.com/kait ...
- Python+USB+Vnet+FTP传输文件开发记录
做一个Python+USB+Vnet+FTP传输文件开发记录
随机推荐
- python格式化输出的三种形式
法一: list_a = [1, 2, 3] str_b = 'aaa' string = "There are two contents:%s, %s" % (list_a, s ...
- Graph & Trees3 - 二分图
\[二分图略解\] \[By\;TYQ\] 二分图定义: \(f(i,L) = [a \in L\;\text{&}\;\forall b \in a.to \;\text{,}\; b \n ...
- 1016D.Vasya And The Matrix#矩阵存在
题目出处:http://codeforces.com/contest/1016/problem/D #include<iostream> #define ll long long int ...
- 微信小程序java8 java7 java6 encryptedData 解密 异常处理
使用java8 java7 java6 解密微信小程序encryptedData可以回遇到一些错误 1.java.security.NoSuchAlgorithmException: Cannot ...
- 吴裕雄--天生自然 pythonTensorFlow图形数据处理:读取MNIST手写图片数据写入的TFRecord文件
import numpy as np import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_dat ...
- Java和Mysql中的数据类型
1.mysql中的基本类型 1.整数: tinyint:1个字节 -128~127 smallint: 2个字节 -32768~32767 int : 4个字节 bigint: 8个字节 2 ...
- 使用node 做静态文件服务器
# 1. 使用server-static 包 使用node可以非常快速的方法把指定目录共享出去 前提条件:安装了node,附带有npm 要托管的文件目录为 /root/www # 先创建一个目录用来存 ...
- python脚本实现自动安装nginx
本文python脚本实现自动化安装是源码安装.实现任意版本安装,默认版本是1.13.11,也可以更改默认版本,手动配置安装目录. 环境:Ubuntu16.04,python3以上版本,Ubuntu自带 ...
- QLIKVIEW-日期格式,数字格式写法
LOAD T_SAL_ORDER.LE_ID, [T_SAL_ORDER.LCY CODE], T_SAL_ORDER.SYSTEM, T_SAL_ORDER.#DataDateTime, T_SAL ...
- idea常用快捷键(对于新手不建议切换使用eclipse)
查看方法实现:ctrl+alt+鼠标实现父类方法:ctrl+i查看方法的具体实现:ctrl+alt(鼠标再点击方法)快速导包:alt+enter格式化:Ctrl+Alt+L格式化当前行:ctrl+sh ...