tcp 大文件上传 ,切换目录 及登陆文件加盐处理

实现大文件的传输

服务器

import socket
import json
import struct
sk = 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":
# 客户端发来一个字典要执行的功能,以及客户端自己的绝对路径
# 服务器要返回这个绝对路径中所有文件及文件夹
# 客户端自己选择进入到哪一层目录下
# 服务器都要返回对应目录下所有文件及文件夹
# 客户随时选择某一个目录下的某一个文件进行下载

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

客户端

import socket
import os
import json
import struct
sk = 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 socket
import 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 Files
while 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 socket
import 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 socketserver
import json
import 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()
扫描二维码关注公众号,回复: 2799922 查看本文章

客户端

import socket
import hashlib
import json
sk = socket.socket()
sk.connect(('127.0.0.1',8080))

dic = {'status':False,'username':None,'password':None}
c = 3
while 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 json
import 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)
 

猜你喜欢

转载自www.cnblogs.com/xdlzs/p/9489428.html
今日推荐