4.21作业

作业:

编写cs架构的软件,实现客户端可以下载服务端的文件,如图片、视频、文本等

服务端:

import socketserver
import os
import json
import struct


class MyRequestHandler(socketserver.BaseRequestHandler):
    def handle(self):
        print(self.client_address)
        while True:
            try:
                file_data = self.request.recv(1024)
                if len(file_data) == 0: break
                file_name = file_data.decode('utf-8')
                BASE_SERVER_DIR = r'C:UsersasusPycharmProjects正课day36作业'
                LOAD_PATH = os.path.join(BASE_SERVER_DIR, file_name)
                total_size = os.path.getsize(LOAD_PATH)
                header_dic = {
                    "filename": file_name,
                    "total_size": total_size,
                }
                json_str = json.dumps(header_dic)
                json_str_bytes = json_str.encode('utf-8')

                x = struct.pack('i', len(json_str_bytes))
                self.request.send(x)

                self.request.send(json_str_bytes)

                with open(LOAD_PATH, mode='rb') as f:
                    for line in f:
                        self.request.send(line)

            except Exception:
                break
        self.request.close()


s = socketserver.ThreadingTCPServer(('127.0.0.1', 8081), MyRequestHandler)
s.serve_forever()

客户端:

import struct
import json
from socket import *

client = socket(AF_INET, SOCK_STREAM)
client.connect(('127.0.0.1', 8081))

while True:
    file_name = input('请输入下载的文件名>>:').strip()
    if len(file_name) == 0: continue
    client.send(file_name.encode('utf-8'))

    x = client.recv(4)
    header_len = struct.unpack('i', x)[0]

    json_str_bytes = client.recv(header_len)
    json_str = json_str_bytes.decode('utf-8')
    header_dic = json.loads(json_str)
    print(header_dic)
    total_size = header_dic["total_size"]

    recv_size = 0
    while recv_size < total_size:
        recv_data = client.recv(1024)
        recv_size += len(recv_data)
        with open(file_name, mode='ab') as f:
            f.write(recv_data)
原文地址:https://www.cnblogs.com/zhangtieshan/p/12749164.html