实现大文件的传输

服务器

import socketimport jsonimport structsk = socket.socket()sk.bind(("127.0.0.1",8001))sk.listen()conn,addr = sk.accept()b_len_dic = conn.recv(4)len_dic = struct.unpack('i',b_len_dic)[0]# 获取到int类型字典的长度,# unpack得到的是一个元组,要取下标为0的位置str_dic = conn.recv(len_dic).decode('utf-8')# str_dic = {"opt":menu.get(num),"filename":None,"filesize":None}dic = json.loads(str_dic)if dic["opt"] == "upload":    filename = "1"+ dic["filename"]    with open(filename,"ab") as f:        while dic['filesize']:            content = conn.recv(1024)            f.write(content)            dic['filesize'] -= len(content)

elif dic["opt"] == "download":    # 客户端发来一个字典要执行的功能,以及客户端自己的绝对路径    # 服务器要返回这个绝对路径中所有文件及文件夹    # 客户端自己选择进入到哪一层目录下    # 服务器都要返回对应目录下所有文件及文件夹    # 客户随时选择某一个目录下的某一个文件进行下载

    # 客户端发送来一个字典,包含了要进行的操作,要下载的文件的绝对路径,    # 根据绝对路径去读取文件内容    # 一边读,一遍发    passconn.close()sk.close()

客户端

import socketimport osimport jsonimport structsk = socket.socket()sk.connect(("127.0.0.1",8001))menu = {"1":"upload","2":"download"}for k,v in menu.items():    print(k,v)num = input("请输入功能选项:")if num == "1":    dic = {"opt":menu.get(num),"filename":None,"filesize":None}    file_path = input("请输入一个绝对路径:")# 文件的绝对路径    # E:\Python S14\day32\实现大文件的传输\11.mp4    filename = os.path.basename(file_path)# 文件名字    filesize = os.path.getsize(file_path)# 获取用户输入的路径中文件的大小    dic["filename"] = filename    dic["filesize"] = filesize    str_dic = json.dumps(dic)    len_dic = len(str_dic)# 获取到字典的长度,是一个int类型的数据   46   146    b_len_dic = struct.pack('i',len_dic)# 用一个4bytes的数据表示字典的长度

    sk.send(b_len_dic + str_dic.encode("utf-8"))# 将bytes类型的字典的长度 + bytes类型的字典的内容,一起发送给服务器

    #  因为上边send字典时,如果程序执行过快,可能会马上执行到下边的send(content)    #  此时有可能会发生粘包,所以在此中间加一个recv,为了避免粘包    with open(file_path,"rb") as f:        while filesize:            content = f.read(1024)            sk.send(content)            filesize -= len(content)

elif num == "2":    pass

**********************************************************************************************************************************************************************

切换目录

服务器

import socketimport os

sk = socket.socket()sk.bind(('127.0.0.1',8082))sk.listen()conn,addr = sk.accept()

def send_data(conn,path):    '''你给我一个目录,我把目录发给client'''    lis_dir = os.listdir(path)    str_dir = '--'.join(lis_dir)    conn.send(str_dir.encode('utf-8'))

abs_path = conn.recv(1024).decode('utf-8')# 获取用户输入的绝对路径current_dir = abs_path + '/'# 以下再处理,都要根据当前路径去处理,无论是返回上一层,还是进入下一层send_data(conn,current_dir)# 把用户输入的路径下的所有文件及文件夹返回给客户端

# C:/Program Files (x86)/Common Fileswhile 1:    cmd = conn.recv(1024).decode('utf-8')    if cmd == '..':        current_dir = current_dir.split('/')[:-2]        current_dir = '/'.join(current_dir)+'/'        # if 如果当前是C盘:        #     就返回给客户端告诉说没有上一层了!        if  '/'  :            conn.send('没有上一层'.encode('utf-8'))        else:

            send_data(conn, current_dir)    else:        filename = cmd.split(' ')[1]# 获取用户输入的文件名字        current_dir += filename + '/'# 将文件名字添加到当前路径下,组成一个完整的新路径        if os.path.isdir(current_dir):# 如果客户输入的文件名字是一个文件夹            send_data(conn, current_dir)        else:# 如果不是一个文件夹            conn.send(b'bu shi wen jian jia')

conn.close()sk.close()

客户端

import socketimport os

sk = socket.socket()sk.connect(('127.0.0.1',8082))abs_path = input('请输入您的根目录:')sk.send(abs_path.encode('utf-8'))current_dir = sk.recv(1024).decode('utf-8')print(current_dir.split('--'))while 1:    cmd = input('请输入>>>')    # cd + 文件夹      ..    if cmd == '..':        sk.send(cmd.encode('utf-8'))        current_dir = sk.recv(1024).decode('utf-8')        print(current_dir.split('--'))    if cmd == 'cd':        filename = input('请输入一个文件夹名:')        sk.send((cmd+' '+filename).encode('utf-8'))        current_dir = sk.recv(1024).decode('utf-8')        print(current_dir.split('--'))

sk.close()

**********************************************************************************************************************************************************************登陆文件加盐处理

服务器

import socketserverimport jsonimport hashlib

def zhuce():    pass

class MySocket(socketserver.BaseRequestHandler):    def handle(self):        sor = b'wusir'#        while 1:            str_dic = self.request.recv(1024).decode('utf-8')            # 接收到 一个字典,类似于{'status':False,'username':None,'password':None}            if not str_dic:break # 当客户端登录失败退出程序的情况下,这里会接收到一个空消息。            dic = json.loads(str_dic)            if not dic['status']:                '''没有登录成功的情况下'''                with open('info','r',encoding='utf-8') as f:                    # 文件内容的存储方式  用户名|密码                    for info in f:                        username,pawd_txt = info.strip().split('|')                        if username == dic['username']:                            '''用户存在,就对客户端发来的用户的密码再次加密,与文件中对比'''                            md5_obj = hashlib.md5(sor)                            md5_obj.update(dic['password'].encode('utf-8'))                            pawd = md5_obj.hexdigest()                            if pawd_txt == pawd:                                '''密码正确的情况下'''                                dic['status'] = True                            else:                                dic['reason'] = '密码错误'                            break                    else:                        '''用户不存在'''                        dic['reason'] = '用户不存在'                        zhuce()                #  dic = {status:False ,  username ,   password,   reason}                #  dic = {status:True ,  username ,   password}                str_dic = json.dumps(dic)                self.request.send(str_dic.encode('utf-8'))            else:                '''已经是登录成功了'''

server = socketserver.ThreadingTCPServer(('127.0.0.1',8080),MySocket)server.serve_forever()

客户端

import socketimport hashlibimport jsonsk = socket.socket()sk.connect(('127.0.0.1',8080))

dic = {'status':False,'username':None,'password':None}c = 3while c:    username = input('请输入用户名')    password = input('请输入密码')

    md5_obj = hashlib.md5(password.encode('utf-8'))    md5_obj.update(username.encode('utf-8'))    pawd_m = md5_obj.hexdigest()

    dic['username'] = username    dic['password'] = pawd_m    str_dic = json.dumps(dic)    sk.send(str_dic.encode('utf-8'))

    # 服务器应该回复我一个这样的字典:    # 是否登录成功,如果没有登录成功是因为什么原因?    res_dic = sk.recv(1024).decode('utf-8')# str_dic    result = json.loads(res_dic)# dic = {status:False/True ,  username ,   password,   reason}    if result['status']:        print('登录成功')        break    else:        print('失败,%s'%result['reason'])        c -= 1

sk.close()

加盐文件用户密码
import jsonimport hashlib

sor = b'wusir'u = 'xiaoxue'p = 'pangpangde'

md5_obj = hashlib.md5(p.encode('utf-8'))md5_obj.update(u.encode('utf-8'))r = md5_obj.hexdigest()

md5_obj = hashlib.md5(sor)md5_obj.update(r.encode('utf-8'))res = md5_obj.hexdigest()print(res)
 

tcp 大文件上传 ,切换目录 及登陆文件加盐处理的更多相关文章

  1. 【FTP】java FTPClient 文件上传内容为空,文件大小为0

    问题:如题所述,使用FTPClient上传至FTP服务器, 表现如下:①文件大小为0 ②上传很小的文件,但是要花费很长的时间,20K要花费2分钟甚至更久 ③没有任何的报错,没有任何的乱码 解决方法: ...

  2. Blazor组件自做九: 用20行代码实现文件上传,浏览目录功能 (3)

    接上篇 Blazor组件自做九: 用20行代码实现文件上传,浏览目录功能 (2) 7. 使用配置文件指定监听地址 打开 appsettings.json 文件,加入一行 "UseUrls&q ...

  3. 表单多文件上传样式美化 && 支持选中文件后删除相关项

    开发中会经常涉及到文件上传的需求,根据业务不同的需求,有不同的文件上传情况. 有简单的单文件上传,有多文件上传,因浏览器原生的文件上传样式及功能的支持度不算太高,很多时候我们会对样式进行美化,对功能进 ...

  4. struts文件上传,获取文件名和文件类型

    struts文件上传,获取文件名和文件类型   Action中还有两个属 性:uploadFileName和uploadContentType,这两个属性分别用于封装上传文件的文件名.文件类型.这是S ...

  5. 【C#公共帮助类】FTPClientHelper帮助类,实现文件上传,目录操作,下载等动作

    关于本文档的说明 本文档使用Socket通信方式来实现ftp文件的上传下载等命令的执行 欢迎传播分享,必须保持原作者的信息,但禁止将该文档直接用于商业盈利. 本人自从几年前走上编程之路,一直致力于收集 ...

  6. C# FTPClientHelper共公类 实现文件上传,目录操作,下载等动作

    文档说明 本文档使用Socket通信方式来实现ftp文件的上传下载等命令的执行 1.基本介绍 由于最近的项目是客户端的程序,需要将客户端的图片文件[切图]-[打包]-[ftp上传],现在就差最后一步了 ...

  7. aspx 文件上传和下载,多文件上传

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="MultiFileUpload. ...

  8. 十九、多文件上传(ajaxFileupload实现多文件上传功能)

    来源于https://www.jb51.net/article/128647.htm 打开google 搜索"ajaxFileupload' ‘多文件上传"可以搜到许许多多类似的, ...

  9. jspsmartupload 文件上传让input数据和文件上传同时提交

    一.使用原因: 文件上传时,表单的属性中必须要有multipart/form-data,如以下例子: <form name="form_post" class="a ...

随机推荐

  1. react 部分ES6写法

    react+react-router+antd 栗子:https://github.com/Aquarius1993/reactApp 模块: 1. 引入模块 import React from 'r ...

  2. Fzu软工第二次作业-词频分析

    (0)前言: Github项目 作业地址 (1)PSP表格: PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 ...

  3. CTF-练习平台-Misc之 多种方法解决

    五.多种方法解决 题目提示:在做题过程中你会得到一个二维码图片 下载文件后解压发现是一个exe文件,打开后报错:将文件后缀名改为txt打开后发现是base64编码 联系到提示说最后是一个二维码,将它转 ...

  4. flash流媒体资料

    http://www.docin.com/p-111227070.html Java mina和c++ ace做socket长连接 测试报告: http://www.iteye.com/problem ...

  5. django 使用Ajax方式POST JSON数据包

    示例1: js: function SaveAction(){ //点击 保存按键 var senddata = {"type":"A", "host ...

  6. Excel的方向键失灵

    Excel的方向键操作不再是sheet范围内转动:而是变成了整个sheet页面在跳动. 不只是Excel,viso也是如此. 这是因为你的Scroll Lock键被按下了:所致箭头被解读为页面滚轮在滑 ...

  7. Qt treewidget样式的自定义(转)

    这个treewidget样式真是写得让人心碎,主因是那个天杀的表头,真是块古里古怪的硬骨头,令人抓狂,一直找不到给表头设定背景图的方法,让我一度决定弃用tree. 后来表头的属性找到了,下拉条又找不到 ...

  8. WPF中控制窗口显示位置的三种方式

    首先新建一个WPF工程,在主界面添加一个按钮,并给按钮添加点击事件button1_Click,然后新建一个用于测试弹出位置的窗口TestWindow.1.在屏幕中间显示,设置window.Window ...

  9. 【jmeter】Jmeter进行分布式性能测试

    由于Jmeter本身的瓶颈,当需要模拟数以千计的并发用户时,使用单台机器模拟所有的并发用户就有些力不从心,甚至还会引起JAVA内存溢出的错误.要解决这个问题,可以使用分布式测试,运行多台机器运行所谓的 ...

  10. 1、zookeeper集群安装

    前提准备3台centos7.0虚拟机 c7003:192.168.70.103 c7004:192.168.70.104 c7005:192.168.70.105 并在三台虚拟机上配置hosts为 1 ...