• 编写ftp实现文件上传


    client 

    import socket
    import json
    sk = socket.socket()
    sk.connect(('127.0.0.1',9000))
    def auth(opt):
        usr = input('please input name').strip()
        pwd = input('please input password').strip()
        dic = {"user":usr,"pwd":pwd,"operate":opt}
        str_dic = json.dumps(dic)
        sk.send(str_dic.encode())
        #接受服务端的数据
        file_info = sk.recv(1024).decode()
        file_dic = json.dumps(file_info)
        return file_dic
    res=auth('register')
    print(res)
    sk.close()

    server:

    import  socketserver
    import json
    import os
    import hashlib
    base_path = os.path.dirname(__file__)
    userinfo = os.path.join(base_path,"db","userinfo.txt")
    class Auth():
        @staticmethod
        def md5(usr,pwd):
            md5_obj = hashlib.md5(usr.encode())
            md5_obj.update(pwd.encode())
            return md5_obj.hexdigest()
        @classmethod
        def register(cls,opt_dic):
            with open(userinfo,mode='r',encoding='utf-8') as fp:
                for line in fp:
                    username = line.split(":")[0]
                    if username == opt_dic["user"]:
                        return {"result":False,"info":"username is used"}
            with open(userinfo,mode='a+',encoding='utf-8') as fp:
                fp.write("%s:%s
    " % (opt_dic["user"],cls.md5(opt_dic["user"],opt_dic["pwd"])))
            return {"result":True,"info":"successed"}
    
    class ftpServe(socketserver.BaseRequestHandler):
        def handle(self):
            opt_dic = self.myrecv()
            print(opt_dic)
            #反射处理不同类的函数
            if hasattr(Auth,opt_dic["operate"]):
                res = getattr(Auth,opt_dic["operate"])(opt_dic)
                #将返回的数据发送给客户端
                self.mysend(res)
    
        #接受数据
        def myrecv(self):
            info = self.request.recv(1024)
            opt_str = info.decode()
            opt_dic = json.loads(opt_str)
            return opt_dic
        #发送数据
        def mysend(self,send_info):
            #将字典->字符串->字节流
            send_info = json.dumps(send_info).encode()
            self.request.send(send_info)
    myserver = socketserver.ThreadingTCPServer(("127.0.0.1",9000), ftpServe)
    #让一个端口绑定多个程序,一般用于测试。
    socketserver.TCPServer.allow_reuse_address = True
    myserver.serve_forever()

    改进版:

    client

    '''
    待解决的问题:反射,静态应用与类的应用
    '''
    
    import socket
    import json
    sk = socket.socket()
    sk.connect(('127.0.0.1',9000))
    def auth(opt):
        usr = input('please input name').strip()
        pwd = input('please input password').strip()
        dic = {"user":usr,"pwd":pwd,"operate":opt}
        str_dic = json.dumps(dic)
        sk.send(str_dic.encode())
        #接受服务端的数据
        file_info = sk.recv(1024).decode()
        file_dic = json.dumps(file_info)
        return file_dic
    def register():
        res = auth('register')
        return res
    
    def login():
        res = auth('login')
        return res
    
    def myexit():
        opt_dic = {"operate":"myexit"}
        sk.send(json.dumps(opt_dic).encode())
        exit("welcome come next")
    
    operate_list=[("login",login),("register",register),("myexit",myexit)]
    def main():
        for i,tup in enumerate(operate_list,start=1):
            print(i,tup[0])
        num = int(input("input num >>>>>").strip())
        res = operate_list[num-1][1]()
        return res
    while True:
        res = main()
        print(res)
    sk.close()

    server:

    import  socketserver
    import json
    import os
    import hashlib
    base_path = os.path.dirname(__file__)
    userinfo = os.path.join(base_path,"db","userinfo.txt")
    class Auth():
        @staticmethod
        def md5(usr,pwd):
            md5_obj = hashlib.md5(usr.encode())
            md5_obj.update(pwd.encode())
            return md5_obj.hexdigest()
        @classmethod
        def register(cls,opt_dic):
            with open(userinfo,mode='r',encoding='utf-8') as fp:
                for line in fp:
                    username = line.split(":")[0]
                    if username == opt_dic["user"]:
                        return {"result":False,"info":"username is used"}
            with open(userinfo,mode='a+',encoding='utf-8') as fp:
                fp.write("%s:%s
    " % (opt_dic["user"],cls.md5(opt_dic["user"],opt_dic["pwd"])))
            return {"result":True,"info":"successed"}
        @classmethod
        def login(cls,opt_dic):
            with open(userinfo,mode='r',encoding='utf-8') as fp:
                for line in fp:
                    username,password = line.strip().split(":")
                    if username == opt_dic['user'] and password == cls.md5(opt_dic["user"],opt_dic["pwd"]):
                        return {"result":True,"info":"login successed"}
                return {"resule":False,"info":'login fail'}
        @classmethod
        def myexit(cls,opt_dic):
            return {"result":"myexit"}
    
    class ftpServe(socketserver.BaseRequestHandler):
        def handle(self):
            while True:
                opt_dic = self.myrecv()
                print(opt_dic)
                #反射处理不同类的函数
                if hasattr(Auth,opt_dic["operate"]):
                    res = getattr(Auth,opt_dic["operate"])(opt_dic)
                    if res['result']=="myexit":
                        return
                    #将返回的数据发送给客户端
                    self.mysend(res)
                else:
                    dic = {"resule":False,"info":'no'}
                    self.mysend(dic)
        #接受数据
        def myrecv(self):
            info = self.request.recv(1024)
            opt_str = info.decode()
            opt_dic = json.loads(opt_str)
            return opt_dic
        #发送数据
        def mysend(self,send_info):
            #将字典->字符串->字节流
            send_info = json.dumps(send_info).encode()
            self.request.send(send_info)
    myserver = socketserver.ThreadingTCPServer(("127.0.0.1",9000), ftpServe)
    #让一个端口绑定多个程序,一般用于测试。
    #socketserver.TCPServer.allow_reuse_address = True
    myserver.serve_forever()
  • 相关阅读:
    一个从MongoDB中导出给定日期范围内数据的shell脚本
    Populate A List Item With Record Group In Oracle Forms Using Populate_List And Create_Group_From_Query Command
    An Example Of Validating Text Item In Oracle Forms Using When-Validate-Item Trigger
    Know How To Use ID_NULL Function To Search An Object In Oracle Forms
    Create XO Checker Game With Oracle Forms
    Using SYSTEM.MOUSE_ITEM In Oracle Forms
    Highlighting Text Item On Entry In Oracle Forms
    How To Tune or Test PLSQL Code Performance in Oracle D2k Forms
    Creating Timer in Oracle D2k / Forms 6i and Displaying a Clock
    Create Timer Example To Show Image Presentation in Oracle Forms
  • 原文地址:https://www.cnblogs.com/topass123/p/12817918.html
Copyright © 2020-2023  润新知