zoukankan      html  css  js  c++  java
  • 4.21---C/S架构,下载服务端文件练习

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

    服务端:

    import socketserver
    import os
    import json
    import struct
    
    class MyRequestHandle(socketserver.BaseRequestHandler):
        def handle(self):
            # 如果tcp协议,self.request=>conn
            print(self.client_address)
            while True:
                try:
                    file_name = self.request.recv(1024)
                    # 拼接文件路径
                    dir_name = os.path.dirname(__file__)
                    file_path = os.path.join(dir_name,file_name)
                    # 读取文件,若为空则返回空给客户端
                    with open(file_path,mode="rb") as f:
                        res = f.read()
                        total_size = len(res)
                    if total_size == 0:
                        res = "None".encode("utf-8")
                        total_size = len(res)
                        file_name = "Error:file has no content!"
    
                    # 1、制作头
                    header_dic = {
                        "filename": file_name,
                        "total_size": total_size,
                        "md5": "123123xi12ix12"
                    }
    
                    json_str = json.dumps(header_dic)
                    json_str_bytes = json_str.encode('utf-8')
    
                    # 2、先把头的长度发过去
                    x = struct.pack('i', len(json_str_bytes))
                    self.request.send(x)
    
                    # 3、发头信息
                    self.request.send(json_str_bytes)
                    # 4、再发真实的数据
                    self.request.send(res)
    
                except Exception:
                    break
            self.request.close()
    
    #  服务端应该做两件事
    # 第一件事:循环地从半连接池中取出链接请求与其建立双向链接,拿到链接对象
    s=socketserver.ThreadingTCPServer(('0.0.0.0',8888),MyRequestHandle)
    s.serve_forever()

    客户端:

    from socket import *
    
    client=socket(AF_INET,SOCK_STREAM)
    client.connect(('39.97.179.91',8888))
    
    while True:
        msg=input('请输入需要下载的文件名:').strip()
        if len(msg) == 0:continue
        client.send(msg.encode('utf-8'))
    
        res=client.recv(1024)
        print(res.decode('utf-8'))
  • 相关阅读:
    了解Cgroup资源配置方法
    了解Harbor私有仓库创建
    Docker私有部署和管理
    Docker构建镜像实例
    Docker镜像的构建方式
    Docker基本管理
    将列表的元素去重
    python打印出txt中的汉字
    join字符串拼接
    %s占位符 format
  • 原文地址:https://www.cnblogs.com/zhubincheng/p/12748862.html
Copyright © 2011-2022 走看看