python_登陆验证文件上传下载_socket
client.py
import os
import sys
import json
import struct
import socket
# 下载--接收文件
def download(sk): # 下载
opt_dic = {'operate':'download'}
my_send(sk,opt_dic)
msg = my_recv(sk)
with open(msg['filename'], 'wb') as f:
print('File is downloading...')
while msg['filesize'] > 0:
content = sk.recv(1024)
msg['filesize'] -= len(content)
f.write(content)
print('File download finished...')
# 上传--传送文件
def upload(sk):
opt_dic = {'operate':'upload'}
my_send(sk,opt_dic)
path_list=my_recv(sk)['upload_path']
for index, path in enumerate(path_list,1):
print(index, path)
selected_path = input('请输入目的文件夹的序号:')
uploaded_file = input('请输入本地要上传的文件的全路径:')
filename = os.path.basename(uploaded_file)
filesize = os.path.getsize(uploaded_file)
dic = {'uploaded_path': selected_path, 'filename': filename, 'filesize': filesize}
my_send(sk,dic)
with open(uploaded_file, mode='rb') as f:
print('File is uploading...')
while filesize > 0:
content = f.read(1024)
filesize -= len(content)
sk.send(content)
print('File upload finished')
# 登录
def login(sk):
while True:
usr = input('用户名:').strip()
pwd = input('密 码 :').strip()
dic = {'username': usr, 'password': pwd} # 将用户名和密码放在字典里发过去,而不是单独发送。
my_send(sk, dic)
ret = my_recv(sk)
if ret['operate'] == 'login' and ret['result']:
print('登录成功')
break
else:
print('登录失败')
# 将 sk.recv(num)封装到函数里:
# 1-提高复用度;2-每次都使用 struct防止粘包 3;将 server,client实现某一功能的代码对应起来(如,两边都有 download())
def my_recv(sk): # 接收
msg_len = sk.recv(4)
dic_len = struct.unpack('i', msg_len)[0]
msg = sk.recv(dic_len).decode('utf-8')
msg = json.loads(msg)
return msg
# 将 sk.send(msg)封装到函数里:
# 1-提高复用度;2-每次都使用 struct防止粘包 3;将 server,client实现某一功能的代码对应起来(如,两边都有 download())
def my_send(sk,dic): # 发送 {'username': usr, 'password': pwd} 或者 {'operate':'download'}
str_dic = json.dumps(dic) # 网络通信中 一般使用 json而非 pickle
b_dic = str_dic.encode('utf-8') # 将 json字符串 encode成 字节串
mlen = struct.pack('i', len(b_dic))
sk.send(mlen) # 4个字节 表示字典转成字节之后的长度
sk.send(b_dic) # 具体的字典数据
def exit(sk):
# sys.exit()
global flag
flag = False
opt_dic = {'operate': 'exit'}
my_send(sk,opt_dic)
# sk.close()
if __name__ == '__main__':
sk = socket.socket()
# sk.connect(('192.168.14.109',9012))
sk.connect(('127.0.0.1',9001))
login(sk) # 登录
# 上传\下载
flag=True
while flag:
opt_lst = ['upload','download','exit']
for index,opt in enumerate(opt_lst,1):
print(index,opt)
num = int(input('请选择您要操作的序号 :'))
getattr(sys.modules[__name__],opt_lst[num-1])(sk)
sk.close()
# sk.close()
server.py (socket版)
import os
import sys
import json
import struct
import socket
import hashlib
# 将 conn.send(msg)封装到函数里,1-提高复用度;2-每次都使用 struct防止粘包
def my_send(conn,dic):
str_dic = json.dumps(dic)
b_dic = str_dic.encode('utf-8')
mlen = struct.pack('i', len(b_dic))
conn.send(mlen) # 4个字节 表示字典转成字节之后的长度
conn.send(b_dic) # 具体的字典数据
# download--发送文件
def download(conn):
abs_path = r'C:\Users\12078\PycharmProjects\OldBoy\Day32\登陆验证文件下载_完整版\视频文件源位置\测试视频.mp4'
filename = os.path.basename(abs_path)
filesize = os.path.getsize(abs_path)
dic = {'filename': filename, 'filesize': filesize}
my_send(conn,dic)
with open(abs_path, mode='rb') as f:
while filesize > 0:
content = f.read(1024)
filesize -= len(content)
conn.send(content)
def upload(conn):
upload_path = ['upload_path1', 'upload_path2']
my_send(conn,{'upload_path':upload_path})
file_dic=my_recv(conn)
file_path = upload_path[int(file_dic['uploaded_path']) - 1] + '\\' + file_dic['filename']
with open(file_path, 'wb') as f:
while file_dic['filesize'] > 0:
content = conn.recv(1024)
file_dic['filesize'] -= len(content)
f.write(content)
# 将 conn.recv(num)封装到函数里,1-提高复用度;2-每次都使用 struct防止粘包
def my_recv(conn):
msg_len = conn.recv(4)
dic_len = struct.unpack('i', msg_len)[0]
msg = conn.recv(dic_len).decode('utf-8')
msg = json.loads(msg) # 网网络通信中使用较多的是json而不是pickle
return msg
# 将密码进行加密,使用username作为 salt
def get_md5(username,password):
md5 = hashlib.md5(username.encode('utf-8'))
md5.update(password.encode('utf-8'))
return md5.hexdigest()
# 登录
def login(conn):
flag = True
while flag:
msg = my_recv(conn) # 接收到的是 dic = {'username': usr, 'password': pwd}
with open('userinfo') as f:
for line in f:
name, pwd = line.strip().split('|')
if name == msg['username'] and pwd == get_md5(name, msg['password']):
res, flag = True, False
break
else:
res = False
dic = {'operate': 'login', 'result': res}
my_send(conn, dic) # 将登录结果发送给 client
def exit(conn):
# sys.exit()
# sk.close()
global flag
flag = False
conn.close() # 只断开和客户端的连接,不关闭服务。
if __name__ == '__main__':
sk = socket.socket()
sk.bind(('127.0.0.1',9001))
sk.listen()
while True: # 允许和多个客户端连接(非并行)
conn,_ =sk.accept()
# 有了一个客户端来连接你
login(conn)
flag = True
while flag:
# 接收消息,根据用户的选择进行上传/下载操作
opt_dic = my_recv(conn) # {'operate':'download'} 或 {'operate':'upload'}
if hasattr(sys.modules[__name__],opt_dic['operate']):
getattr(sys.modules[__name__],opt_dic['operate'])(conn)
# conn.close()
sk.close()
server.py(socketserver版)
import os
import sys
import json
import struct
import hashlib
import socketserver
class Myserver(socketserver.BaseRequestHandler):
def handle(self):
conn = self.request
login(conn)
flag = True
while flag: # 不需要更外层的那个 while了,和多个客户端通讯的任务交给了socketserver.
try:
# 接收消息,根据用户的选择进行上传/下载操作
opt_dic = my_recv(conn) # {'operate':'download'} 或 {'operate':'upload'} ,{'operate':'exit'}
if hasattr(sys.modules[__name__], opt_dic['operate']):
getattr(sys.modules[__name__], opt_dic['operate'])(conn)
if opt_dic['operate']=='exit': flag=False # 这样做判断,虽然破坏了 反射的简介,但【只有这样】才能退出连接。
except ConnectionResetError: # 处理异常断开连接,比如客户端非正常退出。
break
conn.close() # 只断开和客户端的连接,不关闭服务。
# 将 conn.send(msg)封装到函数里,1-提高复用度;2-每次都使用 struct防止粘包; 3-每次 send/recv都struct一下。
def my_send(conn,dic):
str_dic = json.dumps(dic)
b_dic = str_dic.encode('utf-8')
mlen = struct.pack('i', len(b_dic))
conn.send(mlen) # 4个字节 表示字典转成字节之后的长度
conn.send(b_dic) # 具体的字典数据
# download--发送文件
def download(conn):
abs_path = r'C:\Users\12078\PycharmProjects\OldBoy\Day32\登陆验证文件下载_完整版\视频文件源位置\测试视频.mp4'
filename = os.path.basename(abs_path)
filesize = os.path.getsize(abs_path)
dic = {'filename': filename, 'filesize': filesize}
my_send(conn,dic)
with open(abs_path, mode='rb') as f:
while filesize > 0:
content = f.read(1024)
filesize -= len(content)
conn.send(content)
def upload(conn):
upload_path = ['upload_path1', 'upload_path2']
my_send(conn,{'upload_path':upload_path})
file_dic=my_recv(conn)
file_path = upload_path[int(file_dic['uploaded_path']) - 1] + '\\' + file_dic['filename']
with open(file_path, 'wb') as f:
while file_dic['filesize'] > 0:
content = conn.recv(1024)
file_dic['filesize'] -= len(content)
f.write(content)
# 将 conn.recv(num)封装到函数里,1-提高复用度;2-每次都使用 struct防止粘包; 3-每次 send/recv都struct一下。
def my_recv(conn):
msg_len = conn.recv(4)
dic_len = struct.unpack('i', msg_len)[0]
msg = conn.recv(dic_len).decode('utf-8')
msg = json.loads(msg) # 网网络通信中使用较多的是json而不是pickle
return msg
# 将密码进行加密,使用username作为 salt
def get_md5(username,password):
md5 = hashlib.md5(username.encode('utf-8'))
md5.update(password.encode('utf-8'))
return md5.hexdigest()
# 登录
def login(conn):
flag = True
while flag:
msg = my_recv(conn) # 接收到的是 dic = {'username': usr, 'password': pwd}
with open('userinfo') as f:
for line in f:
name, pwd = line.strip().split('|')
if name == msg['username'] and pwd == get_md5(name, msg['password']):
res, flag = True, False
break
else:
res = False
dic = {'operate': 'login', 'result': res}
my_send(conn, dic) # 将登录结果发送给 client
def exit(conn):
# sys.exit()
# sk.close()
# global flag
# flag = False
conn.close() # 只断开和客户端的连接,不关闭服务。
if __name__ == '__main__':
flag = True
server = socketserver.ThreadingTCPServer(('127.0.0.1', 9001), Myserver)
server.serve_forever()
python_登陆验证文件上传下载_socket的更多相关文章
- FastDFS实现文件上传下载实战
正好,淘淘商城讲这一块的时候,我又想起来当时老徐让我写过一个关于实现FastDFS实现文件上传下载的使用文档,当时结合我们的ITOO的视频系统和毕业论文系统,整理了一下,有根据网上查到的知识,总结了一 ...
- HttpClient文件上传下载
1 HTTP HTTP 协议可能是如今 Internet 上使用得最多.最重要的协议了,越来越多的 Java 应用程序须要直接通过 HTTP 协议来訪问网络资源. 尽管在 JDK 的 java.net ...
- Java实现FTP批量大文件上传下载篇1
本文介绍了在Java中,如何使用Java现有的可用的库来编写FTP客户端代码,并开发成Applet控件,做成基于Web的批量.大文件的上传下载控件.文章在比较了一系列FTP客户库的基础上,就其中一个比 ...
- Python 基于Python实现Ftp文件上传,下载
基于Python实现Ftp文件上传,下载 by:授客 QQ:1033553122 测试环境: Ftp客户端:Windows平台 Ftp服务器:Linux平台 Python版本:Python 2.7 ...
- django 12天(跨域,文件上传,下载,cookie,session)
django 12天(跨域,文件上传,下载) 跨域 什么是跨域 1.协议不同 2.端口不同 3.主机不同 如何解决跨域 1.安装django-cors-headers模块 2.在settings.py ...
- Django文件上传下载与富文本编辑框
django文件上传下载 上传 配置settings.py # 设定文件的访问路径,如:访问http://127.0.0.1:8000/media/就可以获取文件 MEDIA_URL = '/medi ...
- Struts的文件上传下载
Struts的文件上传下载 1.文件上传 Struts2的文件上传也是使用fileUpload的组件,这个组默认是集合在框架里面的.且是使用拦截器:<interceptor name=" ...
- Android okHttp网络请求之文件上传下载
前言: 前面介绍了基于okHttp的get.post基本使用(http://www.cnblogs.com/whoislcj/p/5526431.html),今天来实现一下基于okHttp的文件上传. ...
- Selenium2学习-039-WebUI自动化实战实例-文件上传下载
通常在 WebUI 自动化测试过程中必然会涉及到文件上传的自动化测试需求,而开发在进行相应的技术实现是不同的,粗略可划分为两类:input标签类(类型为file)和非input标签类(例如:div.a ...
随机推荐
- Windows 编程基础
1 Windows应用程序的分类 1.1 控制台程序 DOS程序,本身没有窗口,通过WINDOWS下的DOS窗口执行. 1.2 窗口程序 拥有自己的窗口,通过窗口可以和用户进行交互.(比如:记事本,画 ...
- 十一长假我肝了这本超硬核PDF,现决定开源!!
写在前面 在 [冰河技术] 微信公众号中的[互联网工程]专题,更新了不少文章,有些读者反馈说,在公众号中刷 历史文章不太方便,有时会忘记自己看到哪一篇了,当打开一篇文章时,似乎之前已经看过了,但就是不 ...
- fastadmin 增加批量操作字段 提示无权限
是这样的找了权限节点的问题,始终找不到,后来 在社区传世人回答别人问题是提及到 $multiFields 就全局搜了下 在基类 Backend 里找到了这个.然后拿到 控制器中添加需要的参数 再次尝 ...
- Mac zsh中所有命令失效
参考文章 https://blog.csdn.net/hujincai_55/article/details/95680245?utm_medium=distribute.pc_relevant.no ...
- pytest文档59-运行未提交git的用例(pytest-picked)
前言 我们每天写完自动化用例后都会提交到 git 仓库,随着用例的增多,为了保证仓库代码的干净,当有用例新增的时候,我们希望只运行新增的未提交 git 仓库的用例. pytest-picked 插件可 ...
- Kibana基础之直接操作ElasticSearch
1.入门级别操作 Elasticsearch采用Rest风格API,其API就是一次http请求,你可以用任何工具发起http请求 创建索引的请求格式: 请求方式:PUT 请求路径:/索引库名 请求参 ...
- 2020年9月程序员工资统计,平均14459元!你给程序员拖后腿了吗?https://jq.qq.com/?_wv=1027&k=JMPndqoM
2020年9月全国招收程序员362409人.2020年9月全国程序员平均工资14459元,工资中位数12500元,其中95%的人的工资介于5250元到35000元. 工资与上个月持平,但是岗位有所增加 ...
- logstash-配置文件详解
kafka 将 kafka topic 中的数据读取为事件 kafka{ bootstrap_servers=> "kafka01:9092,kafka02:9092,kaf ...
- java axis调用带有soap头(soapheader)的.net webservice
使用axis调用.net带soapheader的webservice是如何实现的,现在贴出代码 <?xml version="1.0" encoding="utf- ...
- js改变,设置table单双行颜色,jquery改变,设置table单双行颜色
1.js实现单双行以不同颜色显示 $(document).ready(function () { var color = "#ffeab3"; $("#GvList tr ...