首页 > 其他分享 >使用socketserver实现文件下载

使用socketserver实现文件下载

时间:2022-12-04 12:55:11浏览次数:32  
标签:文件 socketserver self len dic send file msg 下载

服务端server.py

import os
import json
import struct
import socketserver


class MyServer(socketserver.BaseRequestHandler):

    # 重写handle消息的方法
    def handle(self):
        file_msg = self.recv_msg()
        if file_msg['operate'] == 'download':
            self.download(file_msg)

    # 接收消息
    def recv_msg(self, encoding='utf-8'):
        dict_len_msg = self.request.recv(4)
        dict_len = struct.unpack('i', dict_len_msg)[0]
        file_msg = self.request.recv(dict_len).decode(encoding)
        file_msg = json.loads(file_msg)
        return file_msg

    # 发送消息
    def send_msg(self, dic, encoding='utf-8'):
        str_dic = json.dumps(dic)
        byte_dic = str_dic.encode(encoding)
        dic_len = len(byte_dic)
        byte_len = struct.pack('i', dic_len)
        self.request.send(byte_len)
        self.request.send(byte_dic)

    # 发送文件
    def send_file(self, dic, file_path):
        with open(file_path, 'rb') as f:
            while dic['filesize'] > 2048:
                content = f.read(2048)
                self.request.send(content)
                dic['filesize'] -= len(content)
            else:
                content = f.read()
                self.request.send(content)

    # 下载处理
    def download(self, file_msg):
        file_name = file_msg['filename']
        file_path = os.path.join('./source', file_name)
        dic = {}
        if os.path.isfile(file_path):
            dic['filesize'] = os.path.getsize(file_path)
            dic['isfile'] = True
            self.send_msg(dic)
            self.send_file(dic, file_path)
        else:
            dic['isfile'] = False
            self.send_msg(dic)


server = socketserver.ThreadingTCPServer(('127.0.0.1', 5060), MyServer)
server.serve_forever()

客户端client.py

import json
import struct
import socket


def send_msg(sk, dic, encoding='utf-8'):
    str_dic = json.dumps(dic)
    byte_dic = str_dic.encode(encoding)
    dic_len = len(byte_dic)
    byte_len = struct.pack('i', dic_len)
    sk.send(byte_len)
    sk.send(byte_dic)


def recv_msg(sk, encoding='utf-8'):
    dict_len_msg = sk.recv(4)
    dict_len = struct.unpack('i', dict_len_msg)[0]
    file_msg = sk.recv(dict_len).decode(encoding)
    file_msg = json.loads(file_msg)
    return file_msg


def recv_file(sk, dic, filename):
    if dic['isfile']:
        with open(r'./dest/' + filename, 'wb') as f:
            while dic['filesize'] > 2048:
                content = sk.recv(2048)
                f.write(content)
                dic['filesize'] -= len(content)
            else:
                content = sk.recv(dic['filesize'])
                f.write(content)
                dic['filesize'] -= len(content)

    else:
        print("您要下载的文件不存在")


if __name__ == '__main__':

    # 定义一个客户端,连接服务器
    tcp_client = socket.socket()
    tcp_client.connect(('127.0.0.1', 5060))

    # 下载文件
    filename = input("请输入要下载的文件:")
    dic = {'filename': filename, 'operate': 'download'}
    send_msg(tcp_client, dic)
    dic = recv_msg(tcp_client)
    recv_file(tcp_client, dic, filename)

    # 关闭客户端
    tcp_client.close()

标签:文件,socketserver,self,len,dic,send,file,msg,下载
From: https://www.cnblogs.com/saiya6/p/16949685.html

相关文章

  • wget 下载帮助
    -V,--version显示Wget的版本信息并退出。-h,--help打印此帮助。-b,--background启动后转入后台。-e,--execute=CO......
  • H5文件保存为TIFF
    上周一个朋友拜托我帮它处理下遥感数据,拿到手一看,发现文件格式.h5,但是以往接触的遥感数据格式基本为.tif,带着好奇上网查了一下,维基百科对它的解释:HDF:层级数据格式(Hiera......
  • 手写shell脚本批量修改文件名
    作为前端开发,还原设计稿的同时,还要经常导出素材。某次活动需求上线前需要替换素材30张,导出时文件名如图,上传cdn时,需要重命名。如果一张张手动重命名,麻烦又耗时。于是想到......
  • WPF 读写自定义配置文件
    程序集如下usingSystem.Windows;namespaceWpfApp1{///<summary>///MainWindow.xaml的交互逻辑///</summary>publicpartialclassMainW......
  • Golang文件服务器
    主调函数,设置路由表packagemainimport( "fmt" "net/http" "store/handler")funcmain(){ http.HandleFunc("/file/upload",handler.UploadHandler) http.Ha......
  • Python标准库-Configparser-配置文件解析器
    简介官方文档开发中INI格式的配置文件使用还是有必要的。如果某些配置项需要在运行时由用户来修改指定,比如数据库用户信息等等,这种配置项如果使用INI格式的配置文件来操......
  • Nacos 中的配置文件如何实现加密传输
    小伙伴们知道,SpringCloudConfig很早就提供了配置文件的加解密功能,并且支持对称加密和非对称加密两种不同的模式。Nacos作为分布式配置中心+服务注册中心的合体,在配置文......
  • TLS协议学习(1) -- 在pcapng文件中嵌入(Pre)-Master-Secret
    1.已有方案如下link告知在pcap文件中如何使用(Pre)-Master-Secret文件,以及如何把pcap和(Pre)-Master-Secret文件转为pcapng文件。https://wiki.wireshark.or......
  • 目前最流行的网页自动运行EXE文件
    大家对木马都不陌生了,它可能要算是计算机病毒史上最厉害的了,相信会使木马的人千千万万,但是有很多人苦于怎么把木马发给对方,现在随着计算机的普及,在网络上我相信很少有人会......
  • ssm四个配置文件的相关解释
    一.解释1.application-config.xml1.1总的配置文件,将三个配置联系在一起。2.spring-dao.xml2.1管理数据流层,导入并管理mybatis.xml。2.2mybatis.xml管理数据库连接,操作......