tcp 大文件上传 ,切换目录 及登陆文件加盐处理
实现大文件的传输
服务器
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 大文件上传 ,切换目录 及登陆文件加盐处理的更多相关文章
- 【FTP】java FTPClient 文件上传内容为空,文件大小为0
问题:如题所述,使用FTPClient上传至FTP服务器, 表现如下:①文件大小为0 ②上传很小的文件,但是要花费很长的时间,20K要花费2分钟甚至更久 ③没有任何的报错,没有任何的乱码 解决方法: ...
- Blazor组件自做九: 用20行代码实现文件上传,浏览目录功能 (3)
接上篇 Blazor组件自做九: 用20行代码实现文件上传,浏览目录功能 (2) 7. 使用配置文件指定监听地址 打开 appsettings.json 文件,加入一行 "UseUrls&q ...
- 表单多文件上传样式美化 && 支持选中文件后删除相关项
开发中会经常涉及到文件上传的需求,根据业务不同的需求,有不同的文件上传情况. 有简单的单文件上传,有多文件上传,因浏览器原生的文件上传样式及功能的支持度不算太高,很多时候我们会对样式进行美化,对功能进 ...
- struts文件上传,获取文件名和文件类型
struts文件上传,获取文件名和文件类型 Action中还有两个属 性:uploadFileName和uploadContentType,这两个属性分别用于封装上传文件的文件名.文件类型.这是S ...
- 【C#公共帮助类】FTPClientHelper帮助类,实现文件上传,目录操作,下载等动作
关于本文档的说明 本文档使用Socket通信方式来实现ftp文件的上传下载等命令的执行 欢迎传播分享,必须保持原作者的信息,但禁止将该文档直接用于商业盈利. 本人自从几年前走上编程之路,一直致力于收集 ...
- C# FTPClientHelper共公类 实现文件上传,目录操作,下载等动作
文档说明 本文档使用Socket通信方式来实现ftp文件的上传下载等命令的执行 1.基本介绍 由于最近的项目是客户端的程序,需要将客户端的图片文件[切图]-[打包]-[ftp上传],现在就差最后一步了 ...
- aspx 文件上传和下载,多文件上传
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="MultiFileUpload. ...
- 十九、多文件上传(ajaxFileupload实现多文件上传功能)
来源于https://www.jb51.net/article/128647.htm 打开google 搜索"ajaxFileupload' ‘多文件上传"可以搜到许许多多类似的, ...
- jspsmartupload 文件上传让input数据和文件上传同时提交
一.使用原因: 文件上传时,表单的属性中必须要有multipart/form-data,如以下例子: <form name="form_post" class="a ...
随机推荐
- 如何使用 python3 将RGB 图片转换为 灰度图
首先,介绍第一种方法, 使用 PIL 库, PIL库是一种python语言常用的一个图形处理库. 关于 PIL 库的安装本文就不介绍了. from PIL import Image I ...
- Intellij导入插件工程,不能运行(需要EditConfiguration)
https://blog.csdn.net/wjskeepmaking/article/details/78815896 可以作为参考 这里要说的一点是,如果项目被识别为plugin,那么就应该在项目 ...
- 10款PHP开源网店系统
在当今经济危机的大环境下,网上购物越来越来吃香,网上开店成本低,快捷方便,出名的电子商务网站有淘宝,拍拍,Ebay或是最新的百度有啊,这些网站都提供开店的机会,如果是想自己搭建购物平台,可以从下面选择 ...
- LG4768 [NOI2018]归程
题意 题目背景 本题因为一些原因只能评测16组数据. 剩下的四组数据:https://www.luogu.org/problemnew/show/U31655 题目描述 本题的故事发生在魔力之都,在这 ...
- 重磅来袭,开源Asp.Net MVC网上商城BrnShop正式发布,提供源码下载(转)
BrnShop网上商城是以Asp.Net mvc3为基础开发的网上商城,源代码完全开源(企业版的源代码目前还没有完全整理完成,一旦整理完成也全部开源). 啥话也不说了,直接上源码:下载源码(由于公司服 ...
- git代码回退
情况1.还没有push可能 git add ,commit以后发现代码有点问题,想取消提交,用: reset git reset [--soft | --mixed | --hard] eg: gi ...
- oracle C# 访问
使用oracle的odp.net 进行oracle数据库的访问对于进行oracle数据库的开发来说是比较方便的,使用的方式与ADO.net 是一致的. 一下为使用的测试 1. 安装必要的oracle ...
- NTLM 了解
NTLM是NT LAN Manager的缩写,这也说明了协议的来源.NTLM 是 Windows NT 早期版本的标准安全协议,Windows 2000 支持 NTLM 是为了保持向后兼容.Windo ...
- 二叉搜索树的第k大的节点
题目 给定一颗二叉搜索树,请找出其中的第k大的结点. 思路 如果中序遍历一棵二叉搜索树,遍历序列的数值则是递增排序,因此只需中序遍历一个二叉搜索树即可. #include <iostream&g ...
- 在服务端处理同步发送小消息的性能上Kafka>RocketMQ>RabbitMQ
在发送小消息的场景中,三个消息中间件的表现区分明显: Kafka的吞吐量高达17.3w/s,远超其他两个产品.这主要取决于它的队列模式保证了写磁盘的过程是线性IO.此时broker磁盘IO已达瓶颈. ...