python3-socket验证客户端连接的合法性,下载进度条的实现
时间:2022-06-05
本文章向大家介绍python3-socket验证客户端连接的合法性,下载进度条的实现,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
验证客户端链接的合法性
如果你想在分布式系统中实现一个简单的客户端链接认证功能,又不像SSL那么复杂,那么利用md5+加盐或者hmac+加盐的方式来实现
原理图
为什么要随机字符串,是为了防止网络传输过程中,被截取。
md5的实现方法
server端代码
import os
import socket
import hashlib
sk = socket.socket()
secret_key = '今晚打老虎'
sk.bind(('127.0.0.1', 9595))
sk.listen()
while True:
try:
conn, addr = sk.accept()
random_bytes = os.urandom(32) # 随机返回一个长度为32位的bytes类型的组合
conn.send(random_bytes)
md5 = hashlib.md5(secret_key.encode('utf-8'))
md5.update(random_bytes)
ret = md5.hexdigest()
msg = conn.recv(1024).decode('utf-8')
if msg == ret:print('是合法的客户端')
else:conn.close()
finally:
sk.close()
break
client端代码
import socket
import hashlib
secret_key = '今晚打老虎'
sk = socket.socket()
sk.connect(('127.0.0.1', 9595))
urandom = sk.recv(1024)
md5_obj = hashlib.md5(secret_key.encode('utf-8'))
md5_obj.update(urandom)
sk.send(md5_obj.hexdigest().encode('utf-8'))
print('---------')
sk.close()
先运行server,再运行client,执行结果为
是合法的客户端
hmac模块,专门用来做客户端合法性验证的(加密认证)
server端代码
import os
import socket
import hmac
secret_key = '床前明月光'.encode('utf-8')
sk = socket.socket()
sk.bind(('127.0.0.1', 9595))
sk.listen()
while True:
try:
conn, addr = sk.accept() # 建立连接
random_bytes = os.urandom(32) # 随机一个32长度的bytes类型组合
conn.send(random_bytes)
obj = hmac.new(key=secret_key, msg=random_bytes)
ret = obj.hexdigest()
msg = conn.recv(1024).decode('utf-8')
if msg == ret:print('是合法的客户端')
else:conn.close()
finally:
sk.close()
break
client端代码
import socket
import hmac
secret_key = '床前明月光'.encode('utf-8')
sk = socket.socket()
sk.connect(('127.0.0.1', 9595))
urandom = sk.recv(32)
hmac_obj = hmac.new(key=secret_key, msg=urandom)
sk.send(hmac_obj.hexdigest().encode('utf-8'))
print('---------')
sk.close()
先运行server,再运行client,执行结果为
是合法的客户端
socketserver
实现多个客户端,同时连接
socketserver端代码
import socketserver
class MyServer(socketserver.BaseRequestHandler):
def handle(self):
while True:
print(self.request) # 这里不能使用input,否则卡住了
self.request.send(b'hello') # 跟所有的client打招呼
print(self.request.recv(1024)) # 接收客户端的信息
if __name__ == '__main__':
socketserver.TCPServer.allow_reuse_address = True
server = socketserver.ThreadingTCPServer(('127.0.0.1', 9000), MyServer)
server.serve_forever()
client端代码
import socket
sk = socket.socket()
sk.connect(('127.0.0.1', 9000))
while True:
print(sk.recv(1024))
inp = input('>>>').encode('utf-8')
sk.send(inp)
sk.close()
先运行socketserver,在运行client,执行结果如下,发送一个消息,打印一次hello,可以同时开多个client执行
模拟下载进度条:
import sys
import time
def processBar(num, tital):
rate = num / tital
rate_num = int(rate*100)
if rate_num == 100:
r = 'r下载进度: {}%n'.format(rate_num)
else:
r = 'r下载进度: {}%'.format(rate_num)
sys.stdout.write(r)
sys.stdout.flush
for i in range(101):
processBar(i, 100) # 需要传入下载进度和文件总大小
time.sleep(0.1) # 模拟下载延迟
执行结果
- 产品解析:Github Atom
- Docker+Jenkins持续集成环境(5): android构建与apk发布
- Docker+Jenkins持续集成环境(4):使用etcd+confd实现容器服务注册与发现
- 易企秀前端压缩源码分析与还原
- 关于 JS 拖拽功能的冲突问题及解决方法
- 使用 SVG 和 JS 创建一个由星形变心形的动画
- 如何使用 Bootstrap 搭建更合理的 HTML 结构
- Java遍历Map对象的四种方式
- java 线程public void run()中值如何返回
- Jackson与spring框架整合的坑
- spring shiro整合时自动注入的问题
- mybatis获取update的id
- 点击!AWD攻防解题技巧在此!
- Docker 基础技术之 Linux namespace 详解
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 如何优雅的打造 All-in One 仓库
- matplotlib绘图教程:设置标签与图例
- 企业是如何从头开发一个商业项目的?
- 基于Haproxy的高可用实战
- 组复制常规操作-分布式恢复 | 全方位认识 MySQL 8.0 Group Replication
- 赞!7000 字学习笔记,MySQL 从入到放弃
- 面试官问我Volatile的原理?从操作系统层面的设计怼回去!
- 设计原则之单一职责
- 设计原则之开闭原则
- SpringBoot执行跨域处理
- SpringBoot对全局异常的处理封装
- 自定义springboot-starter揭秘自动配置骚操作
- 【大厂面试题】Redis中是如何实现分布式锁的?
- 最近公司招人,研发组商量了下,暂时定下这么多java面试题!
- 市面上数据库种类那么多,如何选择?