python3 - 基于socketserver模块 简单的文件上传下载(本地测试)

服务端

import socketserver, struct, json, os

IP = '127.0.0.1'
PORT = 8080
SERVER_ADD = (IP, PORT)


class MyTCPClass(socketserver.BaseRequestHandler):

    def get_upload(self, hander):
        file_size = hander['file_length']
        res = b''
        size = 0
        while size < file_size:
            date = self.request.recv(1024)
            size += len(date)
            res += date
        # print(res.decode('utf-8'))
        while True:
            # tar_path = input('请输入指定目录:').strip()
            tar_path = hander['tar_path']
            if not os.path.isdir(tar_path):
                # print('目录不存在')
                return False, '服务器,目标目录不存在'
            f_name = hander['file_name']
            f_path = os.path.join(tar_path, f_name)
            with open(f_path, 'w', encoding='utf-8')as f:
                f.write(res.decode('utf-8'))
                f.flush()
            print('服务器-文件上传成功。')
            return True, '文件上传成功'

    def get_download(self, hander):
        file_path = hander['file_path']
        if not os.path.exists(file_path):
            return False, '服务器,目标文件不存在'
        file_name = (os.path.split(file_path))[1]
        with open(file_path, 'r', encoding='utf-8')as f:
            data = f.read()
            size = len(data)
        hander = {
            'order': 'upload',
            'file_name': file_name,
            'file_length': size
        }
        hander_json = json.dumps(hander)
        b_hander = hander_json.encode('utf-8')
        s_hander = struct.pack('i', len(b_hander))
        self.request.send(s_hander)
        self.request.send(b_hander)
        self.request.send(data.encode('utf-8'))
        return True, '查询文件并返回'

    def handle(self):
        s_hander = self.request.recv(4)
        b_hander = self.request.recv(struct.unpack('i', s_hander)[0])
        hander = json.loads(b_hander.decode('utf-8'))
        order = hander['order']
        perform = {
            'upload': self.get_upload,
            'download': self.get_download,
        }
        res, msg = perform[order](hander)
        print(msg)
        b_msg = msg.encode('utf-8')
        s_msg = struct.pack('i', len(b_msg))
        self.request.send(s_msg)
        self.request.send(b_msg)


if __name__ == '__main__':
    server = socketserver.ThreadingTCPServer(SERVER_ADD, MyTCPClass)
    server.serve_forever()

客户端

import socket, os, json, struct

IP = '127.0.0.1'
PORT = 8080
SERVER_ADD = (IP, PORT)

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(SERVER_ADD)


def choose_order():
    while True:
        order_dic = {
            '1': 'upload',
            '2': 'download',
        }
        for i in order_dic:
            print(i, order_dic[i])

        order_num = input('请输入操作指令:').strip()
        # if order_num == 'q':
        #     return
        if order_num not in order_dic:
            print('请输入正确操作!')
            continue
        order = order_dic[order_num]
        return order


def upload():
    while True:
        file_path = input('请输入文件路径>>').strip()
        if not os.path.exists(file_path):
            print('文件不存在')
            continue
        tar_path = input('请输入指定目录:').strip()
        file_name = (os.path.split(file_path))[1]
        with open(file_path, 'r', encoding='utf-8')as f:
            data = f.read()
            size = len(data)
        hander = {
            'order': 'upload',
            'tar_path': tar_path,
            'file_name': file_name,
            'file_length': size
        }
        hander_json = json.dumps(hander)
        b_hander = hander_json.encode('utf-8')
        s_hander = struct.pack('i', len(b_hander))
        client.send(s_hander)
        client.send(b_hander)
        client.send(data.encode('utf-8'))

        s_res = client.recv(4)
        res = client.recv(struct.unpack('i', s_res)[0])
        res = res.decode('utf-8')
        # print(res)
        return res


def download():
    while True:
        file_path = input('请输入目标文件路径:').strip()
        local_dir = input('请输入本地下载目录>>').strip()
        if not os.path.isdir(local_dir):
            print('目录不存在')
            continue
        hander = {
            'order': 'download',
            'file_path': file_path,
        }
        hander_json = json.dumps(hander)
        b_hander = hander_json.encode('utf-8')
        s_hander = struct.pack('i', len(b_hander))
        client.send(s_hander)
        client.send(b_hander)

        server_hander_size = client.recv(4)
        ser_hander = client.recv(struct.unpack('i', server_hander_size)[0])
        ser_hander = json.loads(ser_hander.decode('utf-8'))
        file_length = ser_hander['file_length']
        res = b''
        size = 0
        while size < file_length:
            date = client.recv(1024)
            size += len(date)
            res += date

        file_name = ser_hander['file_name']
        local_file = os.path.join(local_dir, file_name)
        with open(local_file, 'w', encoding='utf-8')as f:
            f.write(res.decode('utf-8'))
            f.flush()
        # print('客户端-文件下载成功。')
        return '文件下载成功'


perform = {
    'upload': upload,
    'download': download
}
if __name__ == '__main__':
    order = choose_order()
    res = perform[order]()
    print(res)

猜你喜欢

转载自blog.csdn.net/qq_33961117/article/details/82463879