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. 利用 Python 插入 Oracle 数据

    # coding=utf-8 ''''' Created on 2020-01-05 @author: Mr. Zheng ''' import json; import urllib2 import ...

  2. SQL学习 小知识点(一)

    这是我在做实验的时候总结的,随着学习可能会做更多的小总结 ssms上面把所有代码写下来后一块执行是行不通的(极大可能会报错),推测可能是因为ssms先对代码的语法进行了检查.    --My expe ...

  3. Python初学习:简单的练习题

    Python初学习 一些见到那的练习题: 初级难度 设计一重量转换器,输入以g为单位的数字后,返回换算结果以Kg为单位的结果 中级难度 设计一个求直角三角形斜边长的函数,(以两个直角边为参数,求最长边 ...

  4. 多测试_常用linux命令_002

    linux 介绍 常用的操作系统(os): windows .dos.android.ios.unix.linux linux系统:是一个免费.开源的操作系统 支持多cpu,多用户,多线程的操作系统, ...

  5. html学习(3)

    为你的网页中添加一些空格 语法:   1 body> 2 <h1>感悟梦想</h1> 3 来源:作文网  作者:为梦想而飞 4 </body> 认识<h ...

  6. selenium--基础学习

    from selenium import webdriver from selenium.common.exceptions import TimeoutException, NoSuchElemen ...

  7. Harbor 安装教程

    Harbor 安装教程 一. CentOS设置 1. 更换阿里源 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com ...

  8. JavaSE学习笔记01注释、标识符与基本类型

    1. HelloWorld 编写代码 public class Hello{ public static void main(String[] args){ System.out.println(&q ...

  9. Java安全之Commons Collections3分析

    Java安全之Commons Collections3分析 文章首发:Java安全之Commons Collections3分析 0x00 前言 在学习完成前面的CC1链和CC2链后,其实再来看CC3 ...

  10. 不可不知的资源管理调度器Hadoop Yarn

    Yarn(Yet Another Resource Negotiator)是一个资源调度平台,负责为运算程序如Spark.MapReduce分配资源和调度,不参与用户程序内部工作.同样是Master/ ...