博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
上传下载简单版
阅读量:6689 次
发布时间:2019-06-25

本文共 2142 字,大约阅读时间需要 7 分钟。

server------------

#!/usr/bin/env python
# encoding: utf-8  
# Date: 2018/6/7
import socket
import os
import json
import struct
shar_dir = r'E:\python\PycharmProjects\python.base.demo\model3\socket1\上传下载\简单版本\server\share'
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
phone.bind(('127.0.0.1', 9909))
phone.listen(5)
print('starting...')
while True:
    conn,client_addr = phone.accept()
    print(client_addr)
    while True:
        try:
            # 1收命令
            res = conn.recv(8096)  # b'get a.txt'
            if not res:break
            # 2,解析命令,提取相应命令参数
            cmds = res.decode('utf-8').split()  # ['get',filename]
            filename = cmds[1]
            # 3,易读的方式打开文件,读取文件内容发送给客户端
            header_dic = {
                'filename': filename,
                'md5':'xxxdxxx',
                'file_size': os.path.getsize(r'%s\%s' % (shar_dir, filename))
            }
            header_json = json.dumps(header_dic)
            header_bytes = header_json.encode('utf-8')
            # 2,先发送报头的长度
            conn.send(struct.pack('i', len(header_bytes)))
            # 3,再发报头
            conn.send(header_bytes)
            # 4,再发送真实的数据
            with open('%s\%s' % (shar_dir, filename), 'rb') as f:
                # conn.send(f.read())
                for line in f:
                    conn.send(line)
        except ConnectionResetError:
            break
    conn.close()
phone.close()
client--------------------
#!/usr/bin/env python
# encoding: utf-8  
# Date: 2018/6/7
import socket
import struct
import json
dow_dir = r'E:\python\PycharmProjects\python.base.demo\model3\socket1\上传下载\简单版本\client\download'
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
phone.connect(('127.0.0.1', 9909))
while True:
    # 1,发命令
    cmd = input('>>:').strip()
    if not cmd:continue
    phone.send(cmd.encode('utf-8'))
    # 2,以写的方式打开一个新文件
    # 2.1收报头长度
    obj = phone.recv(4)
    header_size = struct.unpack('i', obj)[0]
    # 2.2收报头
    header_bytes = phone.recv(header_size)
    # 从报头中解析出对真实数据的描述信息
    header_json = header_bytes.decode('utf-8')
    header_dic = json.loads(header_json)
    print(header_dic)
    total_size = header_dic['file_size']
    filename = header_dic['filename']
    # 2.4,接收真实的数据
    with open('%s\%s' % (dow_dir, filename), 'wb') as f:  #  服务端打开读方式,这里这种wb方式容易卡主
        recv_size = 0
        while recv_size < total_size:
            line = phone.recv(1024)
            f.write(line)
            recv_size += len(line)
            print('总大小:%s 已下载大小: %s' % (total_size, recv_size))
phone.close()

转载于:https://www.cnblogs.com/fmgao-technology/p/9189435.html

你可能感兴趣的文章
ecshop运行超过30秒超时的限制解决办法
查看>>
家庭物联网:从全屋智能到数据服务
查看>>
大数据领域的新面孔!我国微生物大数据平台获得国家大力支持
查看>>
韩国现代汽车成功实测L4级别自动驾驶汽车
查看>>
大数据产业发展明确四大重点
查看>>
量子计算将能分解任意极大整数,RSA加密或成摆设
查看>>
spring-cloud-starter-hystrix(断路器)服务不通或者调用失败后的错误处理和回调
查看>>
timer的优化故事
查看>>
Python开发(基础):运算符
查看>>
编写一个C语言函数,要求输入一个url,输出该url是首页、目录页或者其他url
查看>>
配置secondarynamenode主机名masters
查看>>
XHTML 1.0 Tags 参考
查看>>
递归再一次让哥震惊了
查看>>
oracle之检查点(Checkpoint)
查看>>
分析无线遥控器信号并制作Hack硬件进行攻击
查看>>
JSONObject 自定义过滤配置
查看>>
Hive job,抛错java.io.FileNotFoundException:/.../container_000001(Is a directory)
查看>>
海量数据查询
查看>>
类的this指针有以下特点
查看>>
mysql主主互备架构
查看>>