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模式下输入的信息,使其模块化,明天还得把这个模块看个详细,这次真的睡了

posted @ 2020-04-02 00:30  崆峒山肖大侠  阅读(182)  评论(0编辑  收藏  举报