从零开始学Python08作业源码:开发简单的FTP(仅供参考)

时间:2023-03-09 06:13:14
从零开始学Python08作业源码:开发简单的FTP(仅供参考)
  • 服务器端:server_server.py
 #!usr/bin/env python
# -*- coding:utf-8 -*-
# auther:Mr.chen
# 描述: import socket
import os
import threading
import time
import json
from user_users import PersonInfo DIR = os.path.dirname(os.path.abspath(__file__))
DIR = DIR+'/Folder/' TAG = True def tcplink(conn,addr):
"""
tcp请求分析函数
:param conn: tcp连接对象
:param addr: 连接地址
:return:
"""
print ("收到来自{0}的连接请求".format(addr))
conn.send('与主机通信中...')
while TAG:
try:
data = conn.recv(4096)
time.sleep(1)
if not data:
break
else:
print (data)
if data == 'ls':
P.view_file(conn)
continue
action,filename = data.strip().split()
action = action.lower()
if action == 'put':
re = P.Recvfile(conn,filename)
if re == True:
print ("文件接收成功!")
else:
print ("文件接收失败!")
elif action == 'get': P.Sendfile(conn,filename)
elif action == 'login':
name, password = filename.split(',')
P = PersonInfo(name, password)
re = P.login()
if re == True:
conn.send('Ready!')
else:
conn.send('False!')
elif action == 'register':
name,password = filename.split(',')
P = PersonInfo(name, password)
re = P.register()
if re == True:
conn.send('Ready!')
else:
conn.send('False!')
else:
print ("请求方的输入有错!")
continue
except Exception,e:
print "tcplink处理出现问题",e
break if __name__ == '__main__':
host = 'localhost'
port = 8888
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind((host,port))
s.listen(5)
print ("服务运行中:正在监听{0}地址的{1}端口:".format(host,port))
while TAG:
# 接受一个新连接
conn,addr = s.accept()
# 创建一个新线程处理TCP连接
t = threading.Thread(target=tcplink,args=(conn,addr))
t.start()
  • 服务器端:user_users.py
 #!usr/bin/env python
# -*- coding:utf-8 -*-
# auther:Mr.chen
# 描述: import time
import os
import pickle class PersonInfo:
"""
用户模型类
"""
DIR = os.path.dirname(os.path.abspath(__file__))
DIR = DIR + '/Folder/'
ConfigDir = DIR.replace('Folder','db') def __init__(self,name,password):
self.Name = name #用户名
self.Password = password #密码
self.DIR = PersonInfo.DIR + self.Name +'/' #用户家目录 def login(self):
"""
用户登陆
:return:
"""
dict = PersonInfo.config_read()
if dict == None:
return False
if self.Name in dict:
if dict[self.Name] == self.Password:
return True
return False def register(self):
"""
用户注册
:return:
"""
if os.path.exists(self.DIR) != True:
os.system('mkdir'+' '+ self.DIR)
try:
dict = PersonInfo.config_read()
if dict == None:
dict = {}
if self.Name not in dict:
dict[self.Name] = self.Password
else:
print ("姓名重复")
return False
re = PersonInfo.config_write(dict)
if re == True:
return True
except Exception,e:
print "注册出现异常!",e
return False def view_file(self,conn):
"""
查看用户家目录
:param conn:
:return:
"""
data = os.popen('ls'+' '+ self.DIR).read()
conn.sendall(data) def Recvfile(self,conn,filename):
"""
接收文件方法
:param conn:tcp连接对象
:param filename:目标文件名
:return:
"""
print ("开始接收文件...")
conn.send('Ready!')
buffer = []
while True:
d = conn.recv(4096)
if d == 'exit':
break
else:
buffer.append(d)
data = ''.join(buffer)
if data == '':
return False
print (data)
print (filename)
print (self.DIR)
with open(self.DIR + filename, 'w') as f:
f.write(data)
return True def Sendfile(self,conn,filename):
"""
放送文件方法
:param conn: tcp连接对象
:param filename: 目标文件名
:return:
""" if os.path.exists(self.DIR + filename):
print ("开始放送文件...")
conn.send('Ready!')
time.sleep(1)
with open(self.DIR + filename, 'r') as f:
while True:
data = f.read(4096)
print (data)
if not data:
break
conn.sendall(data)
time.sleep(1)
conn.send('exit')
print ("文件放送成功!")
else:
conn.send('False!') @staticmethod
def config_read():
"""
配置文件全部读取
:return:
"""
if os.path.exists(PersonInfo.ConfigDir+'user_config'):
with open(PersonInfo.ConfigDir+'user_config','r') as f:
dict = pickle.load(f)
return dict @staticmethod
def config_write(dict):
"""
配置文件全部写入
:param dict:
:return:
"""
with open(PersonInfo.ConfigDir + 'user_config', 'w') as f:
pickle.dump(dict,f)
return True
  • 客户端:server_client.py
#!usr/bin/env python
# -*- coding:utf-8 -*-
# auther:Mr.chen
# 描述: import socket,os
import time
TAG =True DIR = os.path.dirname(os.path.abspath(__file__))
DIR = DIR+'/Folder/'
HOST = 'localhost'
PORT = 8888 def Recvfile(s,filename):
"""
接收文件方法函数
:param s: 套接字封装对象
:param filename: 目标文件名
:return:
"""
print ("开始下载文件...")
buffer = []
while TAG:
d = s.recv(4096)
if d == 'exit':
break
buffer.append(d)
data = ''.join(buffer)
with open(DIR+filename,'w') as f:
f.write(data)
print ("文件下载完毕!") def Sendfile(s,filename):
"""
放送文件方法函数
:param s: 套接字封装对象
:param filename: 目标文件名
:return:
"""
print ("开始上传文件!")
if os.path.exists(DIR+filename):
with open(DIR+filename,'r') as f:
while TAG:
data = f.read(4096)
if not data:
break
s.sendall(data)
time.sleep(1)
s.send('exit')
print ("文件上传完毕")
else:
print ("你的目录里没有这个文件")
time.sleep(1)
s.send('exit') def Confirm(s,command):
"""
验证与服务器连接是否正常;
把用户命令发过去,让服务器做好相应准备准备
:param s: 套接字封装对象
:param command: 用户输入的命令
:return:
"""
s.sendall(command)
re = s.recv(4096)
if re == 'Ready!':
return True
elif re == 'False!':
return False
else:
print ("与服务器连接出现异常!") def File_transfer(s):
"""
用户指令函数
:param s:
:return:
"""
while TAG:
command = raw_input("请输入你想执行的命令>>")
if not command:
continue
if command.lower().strip() == 'help':
print ("请用'put'+'空格'+'文件名'的格式上传文件")
print ("请用'get'+'空格'+'文件名'的格式下载文件")
print ("输入'ls'查看用户服务器家目录")
continue
if command.lower().strip() == 'ls':
s.send('ls')
data = s.recv(4096)
print (data)
continue
try:
action,filename = command.strip().split()
action = action.lower()
except:
print ("您的输入有误!输入help查看帮助文档")
continue
if action == 'put':
re = Confirm(s,command)
if re == True:
Sendfile(s, filename)
else:
print ("对方服务器没有准备好!")
break
elif action == 'get':
re = Confirm(s,command)
if re == True:
Recvfile(s, filename)
elif re == False:
print ("服务器家目录没有这个文件")
else:
print ("对方服务器没有准备好!")
break
else:
print ("你输入的命令有误!输入help查看帮助文档") def Login(s):
"""
用户登录
:param s:
:return:
"""
name = raw_input("请输入你的用户名:")
password = raw_input("请输入你的密码:")
command = 'login'+' '+ name + ',' + password
re = Confirm(s, command)
if re == True:
print ("登陆成功!")
File_transfer(s)
elif re == False:
print ("您的输入有误,请重新输入!")
Login(s)
else:
print ("与服务器连接出现异常!") def Register(s):
"""
用户注册
:param s:
:return:
"""
name = raw_input("请输入你的用户名:")
password = raw_input("请输入你的密码:")
Password = raw_input("请再次输入密码:")
if password != Password:
print ("你的密码两次输入不一致,请重新输入!")
Register(s)
command = 'register' + ' ' + name + ',' + password
print (command)
re = Confirm(s,command)
if re == True:
File_transfer(s)
elif re == False:
print ("用户名重复,请重新输入!")
Register(s)
else:
print ("与服务器连接出现异常!") def Main(s,log = '未联通主机...'):
"""
用户登陆界面
:param s:
:param log:
:return:
"""
text = """
用户登陆界面 {0} 1,用户登陆
2,用户注册
""".format(log)
print (text)
choose = raw_input("请输入索引进行选择:")
if choose == '':
Login(s)
elif choose == '':
Register(s)
else:
print ("你的选择有误!") if __name__ == "__main__": s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
try:
s.connect((HOST,PORT))
Main(s,s.recv(1024))
except Exception,e:
print "服务器连接不上....",e
finally:
s.close()