zoukankan      html  css  js  c++  java
  • day37作业

    服务端
    
    import socket
    import struct
    import json
    import os
    
    
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    server.bind(('172.0.0.1', 8080))
    
    server.listen(5)
    
    while True:
        conn, client_addr = server.accept()
    
        while True:
            try:
    
                file = conn.recv(1024)
                if len(file) == 0:
                    break
    
                # 判断下载的文件存在与否
                if not os.path.exists(file):
                    conn.send('下载链接不存在'.encode('gbk'))
                    break
    
                # 打开文件读取数据
                with open(file, 'rb') as f:
                    res = f.read()
    
                    res_len = len(res)
    
                # 制作头
                header_dic = {"total_size": res_len}
    
                json_str = json.dumps(header_dic)
                json_str_bytes = json_str.encode('gbk')
    
                # 发送头的长度
                x = struct.pack('i', len(json_str_bytes))
                conn.send(x)
    
                # 发送头的数据
                conn.send(json_str_bytes)
    
                conn.send(res)
            except Exception:
                break
        conn.close()
    
    
    
    客户端
    
    import socket
    import json
    import struct
    
    
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    client.connect(('172.0.0.1', 8080))
    
    while True:
        file = input('请输入你要下载的文件名').strip()
    
        if len(file) == 0:
            continue
    
        client.send(file.encode('gbk'))
    
        # 先接收一个4,准备拿出头部信息的长度
        x = client.recv(4)
        header_len = struct.unpack('i', x)[0]
    
        # 有了头的长度之后,去拿头部信息里面的total_size长度
        json_str_bytes = client.recv(header_len)
        json_str = json_str_bytes.decode('gbk')
        header_dic = json.loads(json_str)
        total_size = header_dic["total_size"]
    
        recv_size = 0
        while total_size > recv_size:
            recv_data = client.recv(1024)
            recv_size += len(recv_data)
            print(recv_data.decode('gbk'), end='')
        print()
  • 相关阅读:
    WHYZOJ-#53 线段树区间修改(线段树)
    洛谷-3373 【模板】线段树 2 (线段树)
    暑假训练-藏妹子之处(递推)
    POJ-1258 Agri-Net(kruskal最小生成树)
    POJ-2559 Largest Rectangle in a Histogram(单调栈)
    BZOJ3439 Kpm的MC密码
    BZOJ3438 小M的作物
    BZOJ3436 小K的农场
    BZOJ3437 小P的牧场
    BZOJ1430 小猴打架
  • 原文地址:https://www.cnblogs.com/yding/p/12749026.html
Copyright © 2011-2022 走看看