上传下载优化版本

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

时间: 2024-08-05 09:48:51

上传下载优化版本的相关文章

上传下载简单版

server------------ #!/usr/bin/env python # encoding: utf-8  # Date: 2018/6/7 import socketimport osimport jsonimport struct shar_dir = r'E:\python\PycharmProjects\python.base.demo\model3\socket1\上传下载\简单版本\server\share' phone = socket.socket(socket.AF

向云服务器上传下载文件方法汇总(转)

转载于:https://yq.aliyun.com/articles/64700 摘要: 一.向Windows服务器上传下载文件方式 方法有很多种,此处介绍远程桌面的本地资源共享方法. 1.运行mstsc,连接远程桌面的时候,点"选项>>" 2."本地资源"-->详细信息. 3."磁盘驱动器"前面打钩. 一.向Windows服务器上传下载文件方式 方法有很多种,此处介绍远程桌面的本地资源共享方法. 1.运行mstsc,连接远程桌

经验分享] 向云服务器上传下载文件方法汇总

一.向Windows服务器上传下载文件方式 方法有很多种,此处介绍远程桌面的本地资源共享方法. 1.运行mstsc,连接远程桌面的时候,点"选项>>" <ignore_js_op> 2."本地资源"-->详细信息. <ignore_js_op> 3."磁盘驱动器"前面打钩. <ignore_js_op> 4.连接远程电脑后,打开"我的电脑",就能看到刚刚共享的硬盘驱动器.把

Hadoop之HDFS原理及文件上传下载源码分析(上)

HDFS原理 首先说明下,hadoop的各种搭建方式不再介绍,相信各位玩hadoop的同学随便都能搭出来. 楼主的环境: 操作系统:Ubuntu 15.10 hadoop版本:2.7.3 HA:否(随便搭了个伪分布式) 文件上传 下图描述了Client向HDFS上传一个200M大小的日志文件的大致过程: 首先,Client发起文件上传请求,即通过RPC与NameNode建立通讯. NameNode与各DataNode使用心跳机制来获取DataNode信息.NameNode收到Client请求后,

java web 文件上传下载

文件上传下载案例: 首先是此案例工程的目录结构: 处理上传: FileUploadServlet.java 1 package fnz.fileUploadTest; 2 3 import java.io.File; 4 import java.io.IOException; 5 import java.io.InputStream; 6 import java.io.PrintWriter; 7 import java.text.SimpleDateFormat; 8 import java.

使用Paramiko实现SSH登陆,文件上传下载

1,SSh登陆命令行实现: #!/usr/bin/env python # encoding: utf-8 import paramiko private_key_path = '/Users/aolens/.ssh/id_rsa' key = paramiko.RSAKey.from_private_key_file(private_key_path) ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.Aut

向linux服务器上传下载文件方式收集

向linux服务器上传下载文件方式收集 1. scp [优点]简单方便,安全可靠:支持限速参数[缺点]不支持排除目录[用法] scp就是secure copy,是用来进行远程文件拷贝的.数据传输使用 ssh,并且和ssh 使用相同的认证方式,提供相同的安全保证 . 命令格式: scp [参数] <源地址(用户名@IP地址或主机名)>:<文件路径> <目的地址(用户名 @IP 地址或主机名)>:<文件路径> 举例: scp /home/work/source.

Android开发中使用七牛云存储进行图片上传下载

Android开发中的图片存储本来就是比较耗时耗地的事情,而使用第三方的七牛云,便可以很好的解决这些后顾之忧,最近我也是在学习七牛的SDK,将使用过程在这记录下来,方便以后使用. 先说一下七牛云的存储原理,上面这幅图片是官方给出的原理图,表述当然比较清晰了.可以看出,要进行图片上传的话可以分为五大步: 1. 客户端用户登录到APP的账号系统里面: 2. 客户端上传文件之前,需要向业务服务器申请七牛的上传凭证,这个凭证由业务服务器使用七牛提供的服务端SDK生成: 3. 客户端使用七牛提供的客户端S

javaweb-文件的上传下载

本文用到的jar包: 文件上传:commons-fileupload-1.2.1.jar; commons-io-1.4.jar; 本文需要掌握的知识:html+dom 1 文件的上传概述; 1.1 用户把本地的文件储存到服务器上,就是文件的上传; 1.2 实现文件的上传(目前而言要使用第三方jar包); 1.2.1 jspSmartupload; 适用范围:应用在jsp的模型一里(嵌入执行上传下载操作的JSP文件中)  ; 1.2.2 fileUpload; 来源:Apache commons