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

  • 相关阅读:
    《Linux shell变量总结回顾》RHEL6(转)
    20个最受欢迎的Linux命令(转)
    如果看了这篇文章你还不懂傅里叶变换,那就过来掐死我吧(转)
    妻共贫贱难,夫共富贵难
    [置顶] 阅读Oracle官方文档指南
    Java实现 蓝桥杯 算法训练 递归求二项式系数
    Java实现 蓝桥杯 算法训练 数字三角形
    Java实现 蓝桥杯 算法训练 数字三角形
    Java实现 蓝桥杯 算法训练 数字三角形
    Java实现 蓝桥杯 算法训练 数字三角形
  • 原文地址:https://www.cnblogs.com/xiaoyaotx/p/12617073.html
Copyright © 2011-2022 走看看