import socket
import os
import time
import pickle
Basedb = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
class client_ftp(object):
#客户端类
def __init__(self,add,port):
#客户端属性,地址和端口
self.add = add
self.port = port
#注册用户
def register(self):
username = input('请输入用户名:').strip()
password = input('请输入密码:').strip()
if not username or not password:
print('输入为空!')
elif username in os.listdir('%s/db'%Basedb):
print('用户已存在!')
else:
save = {'username':username,'password':password}
db_path = Basedb + '/db/' + username
#存入用户信息
pickle.dump(save,open(db_path,'wb'))
#生成用户文件夹
os.mkdir(Basedb + '/client_file/' + username)
print('注册成功!') def login_in(self):
#登陆验证方法
username = input('请输入用户名:').strip()
password = input('请输入密码:').strip()
if username in os.listdir('%s/db'%Basedb):
db_path = Basedb + '/db/' + username
db_dict = pickle.load(open(db_path,'rb'))
if password == db_dict['password']:
print('登陆成功!')
flag = True
else:
print('密码错误!')
flag = False
else:
print('用户名错误!')
flag = False
return flag
def conn_server(self):
#连接方法
client = socket.socket()
client.connect((self.add,self.port))
code_in = input('请输入用户名:').strip()
client.send(code_in.encode('UTF-8'))
data = client.recv(1024000).decode()
print(data)
#如果返回成功
if data == 'success':
server_file = os.listdir(Basedb + '/client_file/' + code_in)
send_file = os.listdir(Basedb + '/send')
while 1:
option = input('''
-----option-----
1.输入1获取文件目录;
2.直接输入文件名称下载文件
3.将文件拖至send文件夹中,并输入文件名,上传到服务器
4.退出
''').strip()
if option == '':
client.send('check'.encode('utf-8'))
print(client.recv(1024000).decode())
elif option in server_file:
client.send(option.encode('utf-8'))
data1 = client.recv(1024000).decode()
file_name = Basedb + '/send'
time_now =time.strftime("%Y-%m-%d-%H-%M-%S",time.localtime(time.time()))
with open('%s/%s'%(file_name,time_now),'w') as f:
f.write(data1)
print('接收成功!')
elif option in send_file:
client.send('load'.encode('utf-8'))
print(client.recv(1024000).decode())
f_open = open('%s/send/%s'%(Basedb,option),'r')
back_data = f_open.read()
client.send(str(back_data).encode('utf-8'))
f_open.close()
print('传输成功!')
else:
exit() if __name__ == '__main__':
client_start = client_ftp('localhost',6969)
while 1:
option = input('''
--------option--------
1.注册
2.登陆
3.退出
''').strip()
if option == '':
client_start.register()
elif option =='':
flag = client_start.login_in()
if flag== True :
client_start.conn_server()
else:
print('登陆失败了哥们')
break
else:
exit()
import socket
import os
import time
Base_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
class Server_ftp(object):
#此类为ftp服务端
def __init__(self,add,port):
self.add = add
self.port = port
def conn_listen(self):
server = socket.socket()
server.bind((self.add,self.port))
server.listen(5)
print('监听正在进行!监听地址为:',self.add,'监听端口为:',self.port)
while 1:
conn,addr = server.accept()
print('已建立连接!')
data = conn.recv(1024000).decode()
print("recv:", data)
if not data:
print("client has lost...")
break
elif os.path.exists(Base_path + '/client_file/' + data):
allfile = os.listdir(Base_path + '/client_file/' + data)
conn.send('success'.encode('utf-8'))
while 1:
data1 = conn.recv(1024000).decode()
if not data1:
print("client has lost...")
break
elif data1 == 'check':
conn.send(str(allfile).encode('utf-8'))
break
elif data1 in allfile:
file_name = Base_path + '/client_file/' + data
f_open = open('%s/%s'%(file_name,data1),'rb')
back_data = f_open.read()
conn.send(str(back_data).encode('utf-8'))
f_open.close()
break
elif data1 == 'load':
conn.send('reading'.encode('utf-8'))
data2 = conn.recv(1024000).decode()
if not data2:
print("client has lost...")
break
else:
file_name = Base_path + '/client_file/' + data
time_now =time.strftime("%Y-%m-%d-%H-%M-%S",time.localtime(time.time()))
with open('%s/%s'%(file_name,time_now),'w') as f:
f.write(data2)
print('接收成功!')
conn.send('接收成功!'.encode('utf-8'))
break
else:
print('data1输入错误!')
conn.send('data1输入错误!'.encode('utf-8'))
else:
print('接收错误!')
conn.send('错误输入!'.encode('utf-8'))
break if __name__ == '__main__':
sever_start = Server_ftp('localhost',6969)
sever_start.conn_listen()

python 学习分享-实战篇简单的ftp的更多相关文章

  1. python 学习分享-实战篇高级的ftp

    #server代码 import socketserver,os,hashlib Base_paht = os.path.dirname(os.path.dirname(os.path.abspath ...

  2. python 学习分享-实战篇选课系统

    # 角色:学校.学员.课程.讲师 # 要求: # 1. 创建北京.上海 2 所学校 # 2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开 # ...

  3. python 学习分享-实战篇增删改查作业

    一大波函数来袭 作业要求: 1本次作业通过空格及逗号,将文件拆分成列表,在通过判断add.del.update.select等关键字,来判断用户执行的是哪种命令,根据不同的命令调用不同的函数去处理. ...

  4. python 学习分享-实战篇类 Fabric 主机管理程序开发

    # 类 Fabric 主机管理程序开发: # 1. 运行程序列出主机组或者主机列表 # 2. 选择指定主机或主机组 # 3. 选择让主机或者主机组执行命令或者向其传输文件(上传/下载) # 4. 充分 ...

  5. python 学习分享-函数篇

    函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可以自己创建函数,这 ...

  6. python 学习分享-字典篇

    python字典(Dictionary) dict是无序的 key必须是唯一切不可变的 a={'key1':'value1','key2':'value2'} 字典的增删改查 a['key3']='v ...

  7. python 学习分享-基础篇

    1.python起手式 写下第一个代码,打印‘hello world’ print('hello world') 2.变量 变量是为了存储信息,在程序中被调用,标识数据名称或类型. 变量定义的规则: ...

  8. python 学习分享-函数篇2

    递归 自己玩自己的函数: 1. 必须有一个明确的结束条件 2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少 3. 递归效率不高,递归层次过多会导致栈溢出 递归例子和二分查找都放在里面了 ...

  9. Python学习笔记基础篇——总览

    Python初识与简介[开篇] Python学习笔记——基础篇[第一周]——变量与赋值.用户交互.条件判断.循环控制.数据类型.文本操作 Python学习笔记——基础篇[第二周]——解释器.字符串.列 ...

随机推荐

  1. C++编写字符串类CNString,该类有默认构造函数、类的拷贝函数、类的析构函数及运算符重载

    编码实现字符串类CNString,该类有默认构造函数.类的拷贝函数.类的析构函数及运算符重载,需实现以下“=”运算符.“+”运算.“[]”运算符.“<”运算符及“>”运算符及“==”运算符 ...

  2. sql server 2016新特性 查询存储(Query Store)的性能影响

    前段时间给客户处理性能问题,遇到一个新问题, 客户的架构用的是 alwayson ,并且硬件用的是4路96核心,内存1T ,全固态闪存盘,sql server 2016 . 问题  描述 客户经常出现 ...

  3. 聊聊javascript的事件

    javascript事件1.点击事件 onclick    obtn.click=function(){};2.移入/移出事件 onmouseover/onmouseout 注意:在父级中移入移出,进 ...

  4. JAVA入门2019-JAVA配置(windows7和10通用)IDE推荐和相关软件

    如何安装JDK 首先,略过"什么是JDK",非要问,这就是编译环境,JRE是运行环境.一个写程序,一个部署运行. 下载的方法:百度 java se 或者openJDK(两个差不多, ...

  5. [论文理解]Focal Loss for Dense Object Detection(Retina Net)

    Focal Loss for Dense Object Detection Intro 这又是一篇与何凯明大神有关的作品,文章主要解决了one-stage网络识别率普遍低于two-stage网络的问题 ...

  6. java中的两同两小一大原则

    子类覆盖父类要遵循“两同两小一大” “两同”即方法名相同,形参列表相同 “两小”指的是子类方法返回值类型应比父类方法返回值类型更小或相等,子类方法声明抛出的异常类应比父类方法声明抛出的异常类更小或相等 ...

  7. 区块链工作 jd

    https://www.lagou.com/jobs/4096098.html 技术咨询网站: https://mp.weixin.qq.com/s/hs37UZFGI3uR4qmQ7v346g## ...

  8. 第22题:链表中倒数第k个结点

    题目描述 题目:输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点.例如一个链表有6个结点,从头结点开始它们的值依次是1.2.3.4.5 ...

  9. 2018.10.30 NOIp模拟赛T2 数字对

    [题目描述] 小 H 是个善于思考的学生,现在她又在思考一个有关序列的问题.        她的面前浮现出一个长度为 n 的序列{ai},她想找出一段区间[L, R](1 <= L <= ...

  10. Mysql操作方法类

    帮助类: using System; using System.Collections.Generic; using System.Data; using System.Linq; using Sys ...