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的更多相关文章

  1. FastDFS实现文件上传下载实战

    正好,淘淘商城讲这一块的时候,我又想起来当时老徐让我写过一个关于实现FastDFS实现文件上传下载的使用文档,当时结合我们的ITOO的视频系统和毕业论文系统,整理了一下,有根据网上查到的知识,总结了一 ...

  2. HttpClient文件上传下载

    1 HTTP HTTP 协议可能是如今 Internet 上使用得最多.最重要的协议了,越来越多的 Java 应用程序须要直接通过 HTTP 协议来訪问网络资源. 尽管在 JDK 的 java.net ...

  3. Java实现FTP批量大文件上传下载篇1

    本文介绍了在Java中,如何使用Java现有的可用的库来编写FTP客户端代码,并开发成Applet控件,做成基于Web的批量.大文件的上传下载控件.文章在比较了一系列FTP客户库的基础上,就其中一个比 ...

  4. Python 基于Python实现Ftp文件上传,下载

    基于Python实现Ftp文件上传,下载   by:授客 QQ:1033553122 测试环境: Ftp客户端:Windows平台 Ftp服务器:Linux平台 Python版本:Python 2.7 ...

  5. django 12天(跨域,文件上传,下载,cookie,session)

    django 12天(跨域,文件上传,下载) 跨域 什么是跨域 1.协议不同 2.端口不同 3.主机不同 如何解决跨域 1.安装django-cors-headers模块 2.在settings.py ...

  6. Django文件上传下载与富文本编辑框

    django文件上传下载 上传 配置settings.py # 设定文件的访问路径,如:访问http://127.0.0.1:8000/media/就可以获取文件 MEDIA_URL = '/medi ...

  7. Struts的文件上传下载

    Struts的文件上传下载 1.文件上传 Struts2的文件上传也是使用fileUpload的组件,这个组默认是集合在框架里面的.且是使用拦截器:<interceptor name=" ...

  8. Android okHttp网络请求之文件上传下载

    前言: 前面介绍了基于okHttp的get.post基本使用(http://www.cnblogs.com/whoislcj/p/5526431.html),今天来实现一下基于okHttp的文件上传. ...

  9. Selenium2学习-039-WebUI自动化实战实例-文件上传下载

    通常在 WebUI 自动化测试过程中必然会涉及到文件上传的自动化测试需求,而开发在进行相应的技术实现是不同的,粗略可划分为两类:input标签类(类型为file)和非input标签类(例如:div.a ...

随机推荐

  1. 《Android逆向反编译代码注入》 - 逆向安全入门必看视频教程

      适合人群: Android开发人员.逆向反编译开发人员.以及对Android逆向安全感兴趣的朋友. 视频地址: 51CTO学院:https://edu.51cto.com/course/24485 ...

  2. ZooKeeper伪分布式集群安装及使用

    ZooKeeper伪分布式集群安装及使用 让Hadoop跑在云端系列文章,介绍了如何整合虚拟化和Hadoop,让Hadoop集群跑在VPS虚拟主机上,通过云向用户提供存储和计算的服务. 现在硬件越来越 ...

  3. docker overlay原理

    周末两天研究了一下docker overlay网络的原理,因为我本身对go语言不太熟悉,直接看docker官方的libnetwork库看不太懂,看linux内核的vxlan代码又粗心大意,导致有一个环 ...

  4. 手把手教你AspNetCore WebApi:缓存(MemoryCache和Redis)

    前言 这几天小明又有烦恼了,系统上线一段时间后,系统性能出现了问题,马老板很生气,叫小明一定要解决这个问题.性能问题一般用什么来解决呢?小明第一时间想到了缓存. 什么是缓存 缓存是实际工作中非常常用的 ...

  5. day32 Pyhton 模块02复习 序列化

    一. 什么是序列化 在我们存储数据或者网络传输数据的时候. 需要对我们的对象进行处理. 把对象处理成方便存储和传输的数据格式. 这个过程叫序列化 不同的序列化, 结果也不同. 但是目的是一样的. 都是 ...

  6. IE下文件上传, SCRIPT5: 拒绝访问 问题

    最近遇到一个比较奇葩的问题,某些ie浏览器在页面中上传文件时,无法上传.查看控制台报错: SCRIPT5: 拒绝访问. jquery-3.2.1.min.js, 行4 字符5725 .并且我的最新版I ...

  7. requirements基本使用

    requirements作用描述:很多 Python 项目中经常会包含一个 requirements.txt 文件,里面内容是项目的依赖包及其对应版本号的信息列表,即项目依赖关系清单,其作用是用来重新 ...

  8. 华为路由器配置OSPF

    OSPF是什么 OSPF(Open Shortest Pass First,开放最短路径优先协议),是一个最常用的内部网管协议,是一个链路状态协议. 使用场景:适用于运营商.政府机构等大型网络中多节点 ...

  9. SQL报表语句;SQL获取今日、本周、本月数据

    SQL报表语句     SQL获取今日.本周.本月数据 本日:select * from table where datediff(dd,C_CALLTIME,getdate())=0     --C ...

  10. <audio> 标签

    <audio> 标签定义声音,比如音乐或其他音频流. 实例 一段简单的 HTML 5 音频: