Python学习第39天(ftp习题实现day1)
今后三天或是四天,亦或是五天,将开始对我实现ftp的一个过程进行记录,其实有点类似百度网盘的功能,进行一个初步的实现:
主要要求:
目前主要是做了一些主逻辑,进行到了密码验证这一步骤:
文件目录如下:
主要介绍一下server端的文件吧,
bin端口欧文件
conf 配置文件(包含端口信息,用户信息)
core 主逻辑文件(主要操作的逻辑)
logger 操作日志文件
目前还是比较粗糙的阶段。
先介绍一下服务端的主要代码:
bin文件:ftp_server.py
import os,sys BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(BASE_DIR) from core import main if __name__ == '__main__': main.ArgvHandler()
core文件:main.py
import socketserver import optparse from conf import settings from core import server class ArgvHandler(): def __init__(self): self.op = optparse.OptionParser() # self.op.add_option('-s','--server',dest = 'server') # self.op.add_option('-p','--p',dest = 'port') # 解析模块,暂时未使用到,是argv输入进来的参数以键值对形式保存,打印出来像字典,但是不是字典,通过.的方式调用 options,args = self.op.parse_args() # 假设在运行的初期输入的参数为 -s 127.0.0.1 -p 8080 # print(options) # {'server' : '127.0.0.1' , 'port' : 8080} # print(type(options)) # options 的数据类型是optparse的实例对象 # print(args) # 用于接收后面那些没有标识符作为前缀的参数 self.verify_args(options,args) def verify_args(self,options ,args): cmd = args[0] if hasattr(self,cmd): func = getattr(self,cmd) func() def start(self): print('==========welcome ftp_server==========') s = socketserver.ThreadingTCPServer((settings.IP , settings.PORT),server.ServerHandler) s.serve_forever()
core文件:server.py
import socketserver import json class ServerHandler(socketserver.BaseRequestHandler): def handle(self): while True: data = self.request.recv(1024).strip() data = json.loads(data.decode('utf-8')) ''' {'action' : 'auth' , 'username' : 'xiao', 'password' : 123 ''' if data.get('action'): if hasattr(self,data.get('action')): func = getattr(self,data.get('action')) func(**data) else: print('func error') self.request.send('func error'.encode('utf-8')) else: print('Invalid cmd') self.request.send('Invalid cmd'.encode('utf-8')) def auth(self,**data): print(data) def put(self,**data): pass
conf文件:settings.py
IP = '127.0.0.1' PORT = 8080
关于服务端目前就是这么多,而且很多功能还只是个pass,等周末时间多了再逐个将文件逻辑写下来,现在自己虽然写完了,但是脑子还是处在没跟上的状态
下面是客户端内容,目前实现了对输入的ip地址信息,端口信息的验证
同时与服务端进行交互验证用户名和密码信息
客户端(ftp_client):
import socket import optparse import configparser import json # tcp_client = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # tcp_client.connect(('127.0.0.1',8080)) # tcp_client.send('ok'.encode('utf-8')) # 以上是easy模式下的 class ClientHandler(): def __init__(self): self.op = optparse.OptionParser() self.op.add_option('-s','--server', dest = 'server') self.op.add_option('-P', '--port', dest='port') self.op.add_option('-u', '--username', dest='username') self.op.add_option('-p', '--password', dest='password') self.options,self.args = self.op.parse_args() self.verify_args(self.options,self.args) self.make_connection() def verify_args(self,options , args ): # 对port端口进行校验 server = options.server port = options.port # username = options.username # password = options.password if int(port) < 0 and int(port) > 65535: return True else: exit('the port is in 0~65535') def make_connection(self): self.sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM) self.sock.connect(self.options.server,int(self.options.port)) def interractive(self): self.authenticate() def authenticate(self): if self.options.username is None or self.options.password is None: username = input('username>>>') password = input('password>>>') return get_auth_result(username,password) else: return get_auth_reult(self.options.username,self.options.password) def response(self): data = self.sock.recv(1024).decode('utf-8') data = json.loads(data) return data def get_auth_result(self,user ,pwd): data = { 'action' : 'auth', 'username' : user, 'password' : pwd } self.sock.send(json.dumps(data).encode('utf-8')) response = self.response() print(response) ch = ClientHandler() ch.interractive()
今天关于用户名验证需要复习一下configpraser模块信息,作为明天的重点方向吧,目前密码验证客户端没有问题了,服务端还没能实现
明天继续,我睡了。
差点忘记了,今天还多学了一个optparse模块,用于处理argv模式下输入的信息,使其模块化,明天还得把这个模块看个详细,这次真的睡了