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

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

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'
def put(conn, cmds):
    obj = conn.recv(4)
    header_size = struct.unpack('i', obj)[0]
    # 2.2收报头
    header_bytes = conn.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' % (shar_dir, filename), 'wb') as f:  # 服务端打开读方式,这里这种wb方式容易卡主
        recv_size = 0
        while recv_size < total_size:
            line = conn.recv(1024)
            f.write(line)
            recv_size += len(line)
            print('总大小:%s 已上传大小: %s' % (total_size, recv_size))
def get(conn, cmds):
    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)
def run():
    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]
                if cmds[0] == 'get':
                    get(conn, cmds)
                elif cmds[0] == 'put':
                    put(conn, cmds)
            except ConnectionResetError:
                break
        conn.close()
    phone.close()
if __name__ == '__main__':
    run()
client--------------------
#!/usr/bin/env python
# encoding: utf-8  
# Date: 2018/6/7
import socket
import struct
import json
import os
dow_dir = r'E:\python\PycharmProjects\python.base.demo\model3\socket1\上传下载\优化版本\client\download'
def put(phone, cmds):
    filename = cmds[1]
    # 3,易读的方式打开文件,读取文件内容发送给客户端
    header_dic = {
        'filename': filename,
        'md5': 'xxxdxxx',
        'file_size': os.path.getsize(r'%s/%s' % (dow_dir, filename))
    }
    header_json = json.dumps(header_dic)
    header_bytes = header_json.encode('utf-8')
    # 2,先发送报头的长度
    phone.send(struct.pack('i', len(header_bytes)))
    # 3,再发报头
    phone.send(header_bytes)
    # 4,再发送真实的数据
    with open('%s/%s' % (dow_dir, filename), 'rb') as f:
        # conn.send(f.read())
        for line in f:
            phone.send(line)
def get(phone, cmds):
    # 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))
def run():
    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'))
        cmds = cmd.split()
        if cmds[0] == 'get':
            get(phone, cmds)
        elif cmds[0] == 'put':
            put(phone, cmds)
    phone.close()
if __name__ == '__main__':
    run()

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

你可能感兴趣的文章
基于卷积神经网络的以图搜图算法实现
查看>>
同步与异步的区别
查看>>
SQL获取上月第一天和最后一天
查看>>
填报表更新时去除重复数据
查看>>
淘宝分词怎么查看,详谈淘宝分词原则
查看>>
对于sqli-labs基础篇全程使用sqlmap不用手工注入(七夕礼物!!!)
查看>>
C++雾中风景11:厘清C++类型转换(static_cast,dynamic_cast,reinterpret_cast,const_cast)
查看>>
为什么开发人员必须要了解数据库锁?
查看>>
Lua 学习笔记(二)—— 语句
查看>>
制作自己的Vagrant Box
查看>>
NetCore实践篇:分布式监控客户端ZipkinTracer从入门到放弃之路
查看>>
JAVA学习摘要
查看>>
[Java开发之路](23)装箱与拆箱
查看>>
TextView实现跑马灯效果
查看>>
Mysql字段名与保留字冲突导致的异常解决
查看>>
Rust 1.33.0 发布,OSC 上堪称“零差评”的编程语言
查看>>
Android MotionEvent详解
查看>>
单例模式
查看>>
现在到底还该不该买房?
查看>>
小程序中文件相关api总结
查看>>