多线程FTP项目(4)—— Mysql数据库 + FTP

本文介绍了一个多线程FTP项目的实现,该项目整合了MySQL数据库,包括FTP客户端和服务器端的代码结构。客户端包含bin、config、core和log文件夹,服务器端包含bin、config、core、lib和log文件夹。项目支持用户管理(如创建、登录、删除),目录切换,文件下载(含断点续传)以及日志记录等功能。
摘要由CSDN通过智能技术生成

项目开发目录

请添加图片描述

FTPClient

bin文件夹 Client.py

# -*- coding=gbk -*-
# @author   : aoteman
# @time     : 2022/7/10 10:36

import socket, os, sys

PATH = os.path.dirname(os.path.dirname(__file__))
sys.path.append(PATH)

class FTPclient():
    def __init__(self):
        from optparse import OptionParser

        opt = OptionParser()
        opt.add_option("-H", dest="HOST", help="FTP Server HOST")
        opt.add_option("-P", dest="PORT", type="int", help="FTP Serve PORT")

        values, args = opt.parse_args()

        # print(values, args)

        self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # 实例化 socket
        self.connect(values)

        # 登录的用户名
        self.user = None
        # 展示给用户的信息头
        self.show = None

    def connect(self, values):
        HOST = values.HOST
        PORT = values.PORT

        # print(host, port)

        if HOST and PORT:  # 输入的 HOST 和 PORT 都不能为空
            self.client.connect((HOST, PORT))
            print("connect succeed")
            self.login()  # 连接完成后,进行用户登录
        else:
            exit("ERROR: should supply HOST and PORT !")  # 退出并打印提示

    def login(self):
        count = 3
        while count > 0:
            username = input("please enter your username>>: ").strip()
            password = input("enter your password>>: ").strip()

            sql = "select password from user where username = %s"
            from core import connect_database
            cursor = connect_database.connect()

            rows = cursor.execute(sql, (username))

            if rows == 0: # 输入的用户名不存在
                count -= 1
                print("用户名错误,请重新输入,您还有{}次机会重新输入".format(count))
            elif rows != 0: # 密码错误
                res = cursor.fetchall()[0].get("password")
                if res != password: # 密码错误
                    count -= 1
                    print("密码错误,请重新输入,您还有{}次机会重新输入".format(count))
                else: # 登录成功
                    print("登录成功")
                    self.user = username

                    from log import log
                    log.log(self.user, "login", self.user)

                    msg_dic = self.make_dict(action="log", username=username)
                    self.send_msg(msg_dic)

                    msg_dic = self.recv_msg()
                    self.show = msg_dic.get("show")

                    self.handle()

    def make_dict(self, action,**kwargs)-> dict:
        msg_dic = {
   
            "action": action
        }
        msg_dic.update(**kwargs)

        return msg_dic

    def send_msg(self, msg_dic)->None:
        import struct,json
        str_msg = json.dumps(msg_dic)

        length = struct.pack("q", len(str_msg))

        self.client.send(length)

        self.client.send(str_msg.encode("utf-8"))

    def recv_msg(self)->dict:
        length_dic = self.client.recv(8)

        import struct,json
        str_dic_length = struct.unpack("q", length_dic)[0]

        str_dic = self.client.recv(str_dic_length)

        dic = json.loads(str_dic)

        return dic

    def handle(self):
        """和服务端交互"""
        while True:
            cmd = input("{}>>: ".format(self.show)).strip()
            cmd_list = cmd.split(" ")

            if len(cmd_list) > 1:
                action = cmd_list[0]
                content = cmd_list[1]
            else:
                action = cmd_list[0]
                content = ""

            if hasattr(self, action): # 有该方法
                func = getattr(self, action)
                func(content)

    def md(self, content):
        """在服务端家目录"""
        msg_dic = self.make_dict(action="md", content=content)
        self.send_msg(msg_dic=msg_dic)

        recv_dic = self.recv_msg()

        print(recv_dic.get("stdout"), recv_dic.get("stderr"))

        from log import log
        log.log(self.user, "md", content)

    def dir(self, content):
        """查看服务端用户当前路径"""
        msg_dic = self.make_dict(action="dir", content=content)
        self.send_msg(msg_dic=msg_dic)

        recv_dic = self.recv_msg()

        print(recv_dic.get("stdout"), recv_dic.get("stderr"))

        from log import log
        log.log(self.user, "dir", content)

    def cd(self, content
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值