Python C/S 交互上传下载传输文件基础案例,面向过程版

基础版非对象版,比较low可以了解其工作原理


服务端

import socket
import json
import struct
import os

share_dir = r'C:/server/share'  # 下载目录全局

soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
soc.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR, 1)
soc.bind(('127.0.0.1', 8080))
soc.listen(5)

while True:
    conn, adder = soc.accept()
    print('客户端连接:', adder)
    while True:
        try:
            res = conn.recv(1024)  # b'get a.txt
            print('用户指令:', res)
            if not res:
                break
            # 解析命令,提取相应命令参数
            cmd = res.decode('utf-8').split()  # ['get', '文件名']
            file_name = cmd[1]
            file_path = '%s/%s' % (share_dir, cmd[1])
            print(file_name)
            '''【把客户端要下载的文件,以读的方式打开,读文件内容发送给客户端】'''
            # 组装包头信息
            header_dict = {
                'file_name': file_name,
                'file_size': os.path.getsize(file_path)  # 获取文件大小
            }

            # 转换包头信息
            header_json = json.dumps(header_dict)
            header_byte = header_json.encode('GBK')

            # 发送包头长度
            conn.send(struct.pack('i',len(header_byte)))

            # 发送包头
            conn.send(header_byte)

            # 发送包内容  自动粘包
            with open(file_path, 'rb') as f:  # 必须要用二进制模式打开
                for line in f:  # 逐行发送,防止发送内容超过几个G的容量,更节省内存
                    conn.send(line)

        except ConnectionResetError:
            print('断开连接')
            break
    conn.close()

soc.close()

客户端
import socket
import struct
import json

download_dir = r'C:/client/download'  # 下载目录全局  .

soc = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
soc.connect(('127.0.0.1', 8080))

while True:
    # 发送命令
    cmd = input('>>>').strip()  # get a.txt
    if not cmd:
        continue
    soc.send(cmd.encode('utf-8'))

    '''接收文件的内容,以写的方式打开一个新文件并写入来实现下载功能'''
    # 获取包头长
    header_size = struct.unpack('i',soc.recv(4))[0]
    # 获得包头
    header_dict = json.loads(soc.recv(header_size).decode('GBK'))
    # 解析包头信息 和 文件夹命名
    total_size = header_dict.get('file_size')
    file_path = '%s/%s' % (download_dir, header_dict.get('file_name'))
    print(file_path)
    # 写入到新的文件
    with open(file_path,'wb') as f:  # 必须要用二进制模式打开
        recv_size = 0
        while recv_size < total_size:
            lene = soc.recv(1024)
            f.write(lene)
            recv_size += len(lene)
            print('总大小:%s  已下载大小:%s' % (total_size, recv_size))  # 打印下载进度

soc.close()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值