初级版python登录验证,上传下载文件加MD5文件校验
服务器端程序
import socket
import json
import struct
import hashlib
import os def md5_code(usr, pwd):
ret = hashlib.md5(usr.encode())
ret.update(pwd.encode())
return ret.hexdigest() def login():
recv_msg = conn.recv(1024).decode()
msg_dic = json.loads(recv_msg)
with open('user_msg', 'r', encoding='utf-8') as f1, \
open('user_msg', 'a', encoding='utf-8') as f2:
for con in f1:
con_li = con.strip().split()
if con_li[0] == msg_dic['username'] and con_li[1] == md5_code(msg_dic['username'], msg_dic['password']):
flag = json.dumps({'flag': 1})
conn.send(flag.encode())
return {'flag': 1}
else:
flag = json.dumps({'flag': 0})
conn.send(flag.encode())
content = msg_dic['username'] + '\t' + md5_code(msg_dic['username'], msg_dic['password']) + '\n'
f2.write(content)
return {'flag': 0} def upload():
dic_len = conn.recv(4)
dic_size = struct.unpack('i', dic_len)[0]
file_info = json.loads(conn.recv(dic_size))
f1 = open(file_info['filename'], 'wb')
md5_data = hashlib.md5() while file_info['filesize'] > 0:
# 在最后接收文件不足2048时接收精准字节,避免与后面发送的数据发生粘包
if 0 < file_info['filesize'] < 1204:
content = conn.recv(file_info['filesize'])
else:
content = conn.recv(2048)
md5_data.update(content)
f1.write(content)
# 每次减去实际接收的文件长度可以避免tcp协议拆包时实际接收到的数据没有2048而导致接收数据不完整
file_info['filesize'] -= len(content) f1.close() # 获得校验后的md5值
md5sum = md5_data.hexdigest()
# 接收客户端校验后的md5值
recv_md5 = conn.recv(32).decode() if md5sum == recv_md5:
print('校验成功')
return {'flag': 1}
else:
print('校验失败')
return {'flag': 0} def download():
dic_len = conn.recv(4)
dic_size = struct.unpack('i', dic_len)[0]
file_info = json.loads(conn.recv(dic_size))
file_size = os.path.getsize(file_info['filename']) dir_list = os.listdir('.')
dfile_info = {'filesize': file_size, 'operate': 'download', 'dir_list': dir_list}
file_dic = json.dumps(dfile_info).encode()
file_len = struct.pack('i', len(file_dic)) # 发送文件信息
conn.send(file_len)
conn.send(file_dic) f1 = open(file_info['filename'], 'rb')
md5_data = hashlib.md5() while file_size:
content = f1.read(2048)
md5_data.update(content)
file_size -= len(content)
conn.send(content)
f1.close() md5sum = md5_data.hexdigest()
print(md5sum)
conn.send(md5sum.encode())
return {'flag': 1} server = socket.socket()
server.bind(('127.0.0.1', 8001))
server.listen(5)
conn, addr = server.accept() login_ret = login()
if login_ret['flag']:
while login_ret['flag']:
recv_cmd = conn.recv(1024).decode()
cmd_dic = json.loads(recv_cmd)
if cmd_dic['cmd'] == '':
print('上传文件中')
upload()
elif cmd_dic['cmd'] == '':
print('下载文件中')
download()
elif cmd_dic['cmd'] == '':
break
else:
print('请重新登录') conn.close()
server.close()
客户端程序
import os
import json
import socket
import struct
import hashlib
# import time def login():
usr = input('请输入用户名:')
pwd = input('请输入密码:')
usr_info_dic = {'username': usr, 'password': pwd, 'operate': 'login'}
usr_info = json.dumps(usr_info_dic).encode()
client.send(usr_info)
ret = client.recv(1024).decode()
flag_dic = json.loads(ret)
if flag_dic['flag']:
print('登录成功')
return {'flag': 1}
else:
print('登录失败')
return {'flag': 0} def upload():
# F:\test.mp4
file_path = input('请输入文件路径:')
file_size = os.path.getsize(file_path)
file_name = os.path.basename(file_path)
file_info = {'filesize': file_size, 'filename': file_name, 'operate': 'upload'}
file_dic = json.dumps(file_info).encode()
file_len = struct.pack('i', len(file_dic))
# 发送文件信息
client.send(file_len)
client.send(file_dic) total_size = file_size
# 打开文件准备上传文件
md5_data = hashlib.md5() f1 = open(file_path, 'rb')
while file_size:
content = f1.read(2048*10)
md5_data.update(content)
file_size -= len(content)
client.send(content)
print('\r已上传%s%%' % int((1 - file_size / total_size) * 100), end='')
print('上传成功!')
f1.close() md5sum = md5_data.hexdigest()
print(md5sum)
# time.sleep(0.1)
client.send(md5sum.encode()) return {'flag': 1} def download():
# F:\test.mp4
file_name = input('请输入文件名:')
file_info = {'filename': file_name, 'operate': 'download'}
file_dic = json.dumps(file_info).encode()
file_len = struct.pack('i', len(file_dic))
# # 发送文件信息
client.send(file_len)
client.send(file_dic) dic_len = client.recv(4)
dic_size = struct.unpack('i', dic_len)[0]
dfile_info = json.loads(client.recv(dic_size)) md5_data = hashlib.md5()
for dir_index, dir_name in enumerate(dfile_info['dir_list']):
print(dir_index, dir_name) total_size = dfile_info['filesize']
f1 = open('down' + file_name, 'wb')
while dfile_info['filesize'] > 0:
# 在最后接收文件不足2048时接收精准字节,避免与后面发送的数据发生粘包
if 0 < dfile_info['filesize'] < 1204:
content = client.recv(dfile_info['filesize'])
else:
content = client.recv(2048)
md5_data.update(content)
f1.write(content)
dfile_info['filesize'] -= len(content)
print('\r已下载%s%%' % int((1-dfile_info['filesize'] / total_size) * 100), end='')
f1.close() md5sum = md5_data.hexdigest()
# print('\n', md5sum) recv_md5 = client.recv(32).decode() # print(recv_md5)
if md5sum == recv_md5:
print('校验成功')
return {'flag': 1}
else:
print('校验失败')
return {'flag': 0}
# print('下载成功!')
# return {'flag': 1} def choose_cmd():
print('''
1.上传文件
2.下载文件
3.退出上传下载文件
''')
cmd = input('请输入序号选择相应操作')
dic = {'cmd': cmd}
cmd_dic = json.dumps(dic).encode()
client.send(cmd_dic)
return dic client = socket.socket()
# client.connect(('192.168.13.13', 8001))
client.connect(('127.0.0.1', 8001)) login_ret = login()
if login_ret['flag']:
while login_ret['flag']:
cmd_ret = choose_cmd()
if cmd_ret['cmd'] == '':
upload()
elif cmd_ret['cmd'] == '':
download()
elif cmd_ret['cmd'] == '':
break
else:
print('输入的序号有误')
else:
print('请重新登录') client.close()
初级版python登录验证,上传下载文件加MD5文件校验的更多相关文章
- 使用cmd命令行方式登录ftp上传下载数据
部分用户在使用ftp工具登录空间上传下载过程中经常会遇到各种问题,如主动模式,被动模式,以及其他导致无法登陆ftp .上传数据.下载数据的问题,这时候不妨使用一下命令行方式.命令行下可以避免很多由于f ...
- python实现socket上传下载文件-进度条显示
在python的socket编程中,可以实现上传下载文件,并且在下载的时候,显示进度条,具体的流程如下图所示: 1. 服务器端代码如下: [root@python 519]# cat server.p ...
- python flask解决上传下载的问题
记录瞬间 最近为了解决一些新的需求,简单介入了flask对文件的上传和下载的方法,并分别使用python和curl模拟发送 代码: #! /usr/bin/env python3 # coding:u ...
- AzCopy – 上传/下载 Windows Azure Blob 文件
在我们收到的请求中,有一个频繁出现的请求是提供一种能在 Windows Azure Blob 存储与其本地文件系统之间轻松上传或下载文件的方法.一年半前, 我们很高兴地发布了 AzCopy, Wind ...
- 用SpringMVC实现的上传下载方式二(多文件上传)
参考来源: http://blog.csdn.net/qq_32953079/article/details/52290208 1.导入相关jar包 commons-fileupload.j ...
- python用ftplib上传下载中文报错解决
python中的中文编码一直以来都是一个极为头大的问题,经常抛出编码转换的异常,python中的str和unicode到底是一个什么东西呢?在python中提到unicode,一般指的是unicode ...
- python 实现远端ftp文件上传下载
python 实现ftp上传下载 * 脚本需要传入两个参数,参数1为需要从远端ftp站点下载文件名称,参数2为已知需要下载的文件md5值,文件下载完成后会自动进行md5值校验 * 运行示例 [root ...
- javaEE(14)_文件上传下载
一.文件上传概述 1.实现web开发中的文件上传功能,需完成如下二步操作: •在web页面中添加上传输入项•在servlet中读取上传文件的数据,并保存到本地硬盘中. 2.如何在web页面中添加上传输 ...
- Java Web 项目的文件/文件夹上传下载
需求: 支持大文件批量上传(20G)和下载,同时需要保证上传期间用户电脑不出现卡死等体验: 内网百兆网络上传速度为12MB/S 服务器内存占用低 支持文件夹上传,文件夹中的文件数量达到1万个以上,且包 ...
随机推荐
- 四,memcached的机制
memcached机制: 1,基于c/s架构,协议简单. (1)c/s架构,此时memcached为服务端,我们可以使用如PHP,c/c++等程序连接memcached服务器. (2)memcache ...
- 使用VS Code开发.Net Core 2.0 MVC Web应用程序教程之三(配置文件读取)
干了一天的活,还有点时间,给兄弟们写点东西吧. 大家有没有发现一个问题?那就是在.Net Core的MVC项目里面,没有.config文件了!!!同志们,没有config文件了啊,这样搞,我以后要做些 ...
- [Swift实际操作]七、常见概念-(7)日历Calendar和日期组件DateComponents
本文将为你演示日历和日期组件的使用.通过日历的日期部件,可以获得日期的各个部分. 首先引入需要用到的界面工具框架 import UIKit 初始化一个日期对象,其值为当前的日期. let dt = D ...
- Optimizing Your App for Today’s Internet
这个 session 的主讲人感觉是一个很典型的美国人,年纪也不小. 网络现状 四十亿人在使用因特网,大概占有世界人口的一半.上网人数的增长在减缓. 但是网络仍然在增长.增长点主要在物联网.第三世界国 ...
- 下载apache-tomcat-9.0.17-windows-x64及安装以及用途
首先我们先去这个网站下载http://www.apache.org/,进入Tomcat,点击Tomcat9 下载64-bit Windows_zip 当我们下载好了之后解压,把多余的文件删除掉,也可以 ...
- 添加新内容的四个 jQuery 方法:append,prepend,after,before
添加新内容的四个 jQuery 方法区别如下: append() - 在被选元素(里面)的结尾插入内容prepend() - 在被选元素(里面)的开头插入内容 //jQuery append() 方法 ...
- php 常见图片处理函数封装
<?php /** * 常见图像处理函数的封装 */ class Image{ private $info=[]; private $width;//原始图片宽度 private $height ...
- R程序包
=== 数据基础操作 ===reshape2 横向.纵向做数据变换,例如把纵向堆叠在数据库中的证券行情数据转换成一个按照不同证券代码横向排列,按照时间纵向排列收盘价的数据表stringr 方便地用正则 ...
- 11、使用xamarin实现全屏播放rtmp之类的直播视频
直播类的app大部分都是以rtmp hls播放为主.目前主流的app解决方案大部分是引入ijkplayer 这个是基于ffmpeg中的ffplayer实现的. 众所周知ffmpeg的解码能力是一流的. ...
- 剑指offer五十八之对称的二叉树
一.题目 请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的.二.思路 递归做,详见代码 三.代码 /* public class TreeN ...