前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python3-socket验证客户端连接的合法性,下载进度条的实现

python3-socket验证客户端连接的合法性,下载进度条的实现

作者头像
py3study
发布2018-08-02 16:57:42
1.1K0
发布2018-08-02 16:57:42
举报
文章被收录于专栏:python3python3

验证客户端链接的合法性

如果你想在分布式系统中实现一个简单的客户端链接认证功能,又不像SSL那么复杂,那么利用md5+加盐或者hmac+加盐的方式来实现

原理图

blob.png
blob.png

为什么要随机字符串,是为了防止网络传输过程中,被截取。

md5的实现方法

server端代码

代码语言:javascript
复制
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端代码

代码语言:javascript
复制
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端代码

代码语言:javascript
复制
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端代码

代码语言:javascript
复制
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端代码

代码语言:javascript
复制
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端代码

代码语言:javascript
复制
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执行

download.gif
download.gif

模拟下载进度条:

代码语言:javascript
复制
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)  # 模拟下载延迟

执行结果

download.gif
download.gif
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-05-08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档