1. import socket
  2. import os
  3. import time
  4. import pickle
  5. Basedb = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
  6. class client_ftp(object):
  7. #客户端类
  8. def __init__(self,add,port):
  9. #客户端属性,地址和端口
  10. self.add = add
  11. self.port = port
  12. #注册用户
  13. def register(self):
  14. username = input('请输入用户名:').strip()
  15. password = input('请输入密码:').strip()
  16. if not username or not password:
  17. print('输入为空!')
  18. elif username in os.listdir('%s/db'%Basedb):
  19. print('用户已存在!')
  20. else:
  21. save = {'username':username,'password':password}
  22. db_path = Basedb + '/db/' + username
  23. #存入用户信息
  24. pickle.dump(save,open(db_path,'wb'))
  25. #生成用户文件夹
  26. os.mkdir(Basedb + '/client_file/' + username)
  27. print('注册成功!')
  28.  
  29. def login_in(self):
  30. #登陆验证方法
  31. username = input('请输入用户名:').strip()
  32. password = input('请输入密码:').strip()
  33. if username in os.listdir('%s/db'%Basedb):
  34. db_path = Basedb + '/db/' + username
  35. db_dict = pickle.load(open(db_path,'rb'))
  36. if password == db_dict['password']:
  37. print('登陆成功!')
  38. flag = True
  39. else:
  40. print('密码错误!')
  41. flag = False
  42. else:
  43. print('用户名错误!')
  44. flag = False
  45. return flag
  46. def conn_server(self):
  47. #连接方法
  48. client = socket.socket()
  49. client.connect((self.add,self.port))
  50. code_in = input('请输入用户名:').strip()
  51. client.send(code_in.encode('UTF-8'))
  52. data = client.recv(1024000).decode()
  53. print(data)
  54. #如果返回成功
  55. if data == 'success':
  56. server_file = os.listdir(Basedb + '/client_file/' + code_in)
  57. send_file = os.listdir(Basedb + '/send')
  58. while 1:
  59. option = input('''
  60. -----option-----
  61. 1.输入1获取文件目录;
  62. 2.直接输入文件名称下载文件
  63. 3.将文件拖至send文件夹中,并输入文件名,上传到服务器
  64. 4.退出
  65. ''').strip()
  66. if option == '':
  67. client.send('check'.encode('utf-8'))
  68. print(client.recv(1024000).decode())
  69. elif option in server_file:
  70. client.send(option.encode('utf-8'))
  71. data1 = client.recv(1024000).decode()
  72. file_name = Basedb + '/send'
  73. time_now =time.strftime("%Y-%m-%d-%H-%M-%S",time.localtime(time.time()))
  74. with open('%s/%s'%(file_name,time_now),'w') as f:
  75. f.write(data1)
  76. print('接收成功!')
  77. elif option in send_file:
  78. client.send('load'.encode('utf-8'))
  79. print(client.recv(1024000).decode())
  80. f_open = open('%s/send/%s'%(Basedb,option),'r')
  81. back_data = f_open.read()
  82. client.send(str(back_data).encode('utf-8'))
  83. f_open.close()
  84. print('传输成功!')
  85. else:
  86. exit()
  87.  
  88. if __name__ == '__main__':
  89. client_start = client_ftp('localhost',6969)
  90. while 1:
  91. option = input('''
  92. --------option--------
  93. 1.注册
  94. 2.登陆
  95. 3.退出
  96. ''').strip()
  97. if option == '':
  98. client_start.register()
  99. elif option =='':
  100. flag = client_start.login_in()
  101. if flag== True :
  102. client_start.conn_server()
  103. else:
  104. print('登陆失败了哥们')
  105. break
  106. else:
  107. exit()
  1. import socket
  2. import os
  3. import time
  4. Base_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
  5. class Server_ftp(object):
  6. #此类为ftp服务端
  7. def __init__(self,add,port):
  8. self.add = add
  9. self.port = port
  10. def conn_listen(self):
  11. server = socket.socket()
  12. server.bind((self.add,self.port))
  13. server.listen(5)
  14. print('监听正在进行!监听地址为:',self.add,'监听端口为:',self.port)
  15. while 1:
  16. conn,addr = server.accept()
  17. print('已建立连接!')
  18. data = conn.recv(1024000).decode()
  19. print("recv:", data)
  20. if not data:
  21. print("client has lost...")
  22. break
  23. elif os.path.exists(Base_path + '/client_file/' + data):
  24. allfile = os.listdir(Base_path + '/client_file/' + data)
  25. conn.send('success'.encode('utf-8'))
  26. while 1:
  27. data1 = conn.recv(1024000).decode()
  28. if not data1:
  29. print("client has lost...")
  30. break
  31. elif data1 == 'check':
  32. conn.send(str(allfile).encode('utf-8'))
  33. break
  34. elif data1 in allfile:
  35. file_name = Base_path + '/client_file/' + data
  36. f_open = open('%s/%s'%(file_name,data1),'rb')
  37. back_data = f_open.read()
  38. conn.send(str(back_data).encode('utf-8'))
  39. f_open.close()
  40. break
  41. elif data1 == 'load':
  42. conn.send('reading'.encode('utf-8'))
  43. data2 = conn.recv(1024000).decode()
  44. if not data2:
  45. print("client has lost...")
  46. break
  47. else:
  48. file_name = Base_path + '/client_file/' + data
  49. time_now =time.strftime("%Y-%m-%d-%H-%M-%S",time.localtime(time.time()))
  50. with open('%s/%s'%(file_name,time_now),'w') as f:
  51. f.write(data2)
  52. print('接收成功!')
  53. conn.send('接收成功!'.encode('utf-8'))
  54. break
  55. else:
  56. print('data1输入错误!')
  57. conn.send('data1输入错误!'.encode('utf-8'))
  58. else:
  59. print('接收错误!')
  60. conn.send('错误输入!'.encode('utf-8'))
  61. break
  62.  
  63. if __name__ == '__main__':
  64. sever_start = Server_ftp('localhost',6969)
  65. 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. 签证-L1/L2

    http://blog.sina.com.cn/s/blog_7664b7f70102uweb.html 14年4月我接到公司通知,要从MICROSTRATEGY中国研发中心内部transfer到美国 ...

  2. VMware安装win7系统

    1.创建一个虚拟机 2.配置iso映射文件   3.设置boot设置第一启动为cd   4.快速分区后重启电脑,然后选择[A]安装win7.  重启电脑后安装win7系统   搞定...  

  3. co-dialog弹出框组件-版本v2.0.1

    具体案例查看co-dialog:https://koringz.github.io/co-dialog/index.html 2.0.1版本优化项,代码压缩,修复PC和移动端自适应,修复显示弹出框浏览 ...

  4. C++指针的概念解读

    C++指针的概念解读 超详细 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址.要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区 ...

  5. go语言,第三方包相对路径导入包引起的问题及解决方案(goquery)

    对go语言而言,跟踪init很显然包有且仅有一次被导入的可能. 但是重复引用了goquery包,后编译出现问题 项目涉及相关目录 ├── main.go└── parse    └── parse.g ...

  6. mac 下删除非空文件夹

    Linux中rmdir命令是用来删除空的目录.使用方式: rmdir [-p] dirName 参数: -p 是当子目录被删除后使它也成为空目录的话,则顺便一并删除. 举例说明:rmdir folde ...

  7. 由一道CTF pwn题深入理解libc2.26中的tcache机制

    本文首发安全客:https://www.anquanke.com/post/id/104760 在刚结束的HITB-XCTF有一道pwn题gundam使用了2.26版本的libc.因为2.26版本中加 ...

  8. iOS 闭包传值 和 代理传值

    let vc = ViewController() let navc = UINavigationController(rootViewController: vc) window = UIWindo ...

  9. A1043 Is It a Binary Search Tree (25 分)

    A Binary Search Tree (BST) is recursively defined as a binary tree which has the following propertie ...

  10. 1048: [HAOI2007]分割矩阵

    Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1184  Solved: 863[Submit][Status][Discuss] Descripti ...