zoukankan      html  css  js  c++  java
  • 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)
    
  • 相关阅读:
    Java的日期类和日期格式化类
    Java中的内部类
    c#中的里氏转换和Java中强制类型转换在多态中的应用
    MySQL存储引擎
    如何控制多线程执行顺序
    为什么 1000==1000 返回为false,而 100==100 会返回为true
    HashMap和HashTable的区别
    打印昨天的当前时刻
    怎样将GB2312编码的字符串转换为ISO-8859-1编码的字符串?
    MyBatis中 # 和 $ 的区别?
  • 原文地址:https://www.cnblogs.com/zhangtieshan/p/12749164.html
Copyright © 2011-2022 走看看