day26_python_1124
1.内容回顾
2.验证客户端的合法性
3.block + 进度条
4.数据的输入和输出(铺垫并发编程)(操作系统基础)
5.进程的概念+sys.argv
1.内容回顾
# udp协议 和 tcp协议
# udp协议 :传输速度快、不可靠、无连接、面向数据包的
# tcp协议 :传输速度慢、可靠的、面向连接的、流式传输、全双工
# 三次握手、四次挥手
# 同一时间只能允许一个客户端和server端建立连接 - 原生socket
# 传输速度的快慢是如何决定的?udp不需要消息回执,tcp需要回执
# socketserver
# 写一个socket的server端,能够同时和多个client端进行通信
# socketserver 的server端不能用input
# 如何写
# 第一、必须继承socketserver.BaseRequestHandler
# 第二、自定义一个类必须实现handle方法
# 第三、自定义类中的self.request就是conn
# 如何启动这个程序?
# obj = socketserver.ThreadingTCPServer((ip,port),自定义类名)
# obj.serve_forever()
2.验证客户端的合法性
# 1.需要认证
# 程序和用户打交道的时候才会用到用户认证
# 对所有的客户端进行统一的认证
# 我现在要做的事情
# 写一个server端
# 写一个client端 特殊的 符合我的server端要求的代码
# 1.client端不会被其他机器获取到
# 2.即使客户端的代码不在别人手上 有心人仍然可以非法的访问我们的程序
# hashlib
# 密钥
# 随机的字符串
# server 密钥 发送一个随机字符串,密钥为盐,对随机字符串进行摘要 得到一个字符串结果
# client 密钥 密钥为盐,对随机字符串进行摘要 得到一个字符串结果 将结果发送回server端
import os
print(os.urandom(32))
import hmac
# obj = hmac.new(b'alexsb',os.urandom(32))
# print(obj.digest())
# hmac.compare_digest(res1,res2)
server
import osimport socketimport hmac def auth(conn): secret_key = b'alexsb' rand_b = os.urandom(32) # 32字节随机数btyes conn.send(rand_b) obj = hmac.new(secret_key, rand_b) # 计算 res1 = obj.digest() # 返回bytes res2 = conn.recv(1024) cmp_res = hmac.compare_digest(res1, res2) # 比较返回T or F return cmp_res sk = socket.socket()sk.bind(('127.0.0.1',9600))sk.listen()conn,addr = sk.accept()res =auth(conn)if res: print('是合法的客户端') conn.send('你好'.encode())else: conn.close() conn.close()sk.close()
client
import socketimport hmac def auth(sk): secret_key = b'alexsb' rand_b = sk.recv(1024) obj = hmac.new(secret_key, rand_b) res2 = obj.digest() sk.send(res2) sk = socket.socket()sk.connect(('127.0.0.1',9600))auth(sk)msg = sk.recv(1024)print(msg.decode()) sk.close()
3.block + 进度条
# 阻塞模型
# accept
# recv
# recvfrom
# 非阻塞
# accept
# recv
# recvfrom
import socket sk = socket.socket()sk.setblocking(False) #将阻塞设置不阻塞sk.bind(('127.0.0.1',9600))sk.listen()while True: #会报错,加except解决 try: sk.accept() except BlockingIOError: pass
进度条
import timefor i in range(0,101,2): time.sleep(0.1) char_num = i//2 #打印多少个'*' per_str = '\r%s%% : %s\n' % (i, '*' * char_num) if i == 100 else '\r%s%% : %s'%(i,'*'*char_num) print(per_str,end='')print('其他的内容')
4.数据的输入和输出(铺垫并发编程)(操作系统基础)
# I/O操作
# 文件、网络
# i = input 输入
# 从任何其他地方 --> 内存
# 读文件、json.load
# 从网络上接收信息
# o = output 输出
# 内存 --> 放到任何其他地方
# 写文件、json.dump
# 向网络上发送 send sendto
# cpu
# 主要用来做计算用
# 内存
# 存储数据 断电消失 存取速度快
# 硬盘
# 存储数据 读取速度慢 永久存储
# 如何提高cpu的利用率
# 多道操作系统
# CPU的利用率极大提高
# 数据隔离的概念
# 操作系统的概念
# 研究生 :5min 没有IO操作
# 老教授 :24h 没有IO操作
# 让谁先计算?
# 先来先计算算法
# 5min 24h 5min
# 短作业优先算法
# 分时操作系统
# 时间片
# 每一个任务都执行一个时间片的时间,这样就能让多个任务在同一个时间段内看起来是共同执行的
# 极大的提高了用户体验
# 单纯的 由于时间片到了 就切换任务,能不能节省时间?
# 分布式
# 进程
# 进行中的程序
# 进程
# 每一个进程都有一个唯一的进程id
# 进程 :所有的进程与进程之间的 内存 是隔离的
# 进程是计算机中最小的资源分配单位
5.进程的概念+sys.argv
# 并行和并发
# 进程的三状态 : 就绪、运行、阻塞(三状态图)
# 同步异步 :
# 同步 一件事情的执行必须依赖另一件事情的结束,强调的是两件事情的顺序性
# 异步 两件事情可以同时进行
# 阻塞非阻塞 :
# 同步阻塞 :
# 异步阻塞 :
# 同步非阻塞 : a+b+c =d + c
# 异步非阻塞 :
# sys.argv #添加知识
import sys # python解释器
print('我正常的逻辑')
# print(sys.argv) # 在执行python文件的时候
# python 某文件 C:\Python36\python.exe D:/python骑士计划3期/day26/5.进程的概念.py
# python 某文件 参数1 参数2 参数3
# argv指参数
# sys.argv是python解释器在运行的时候传递进来的参数
# if sys.argv[1] == 'alex' and sys.argv[2] == 'sb':
# print('登陆成功')
# else:
# print('登陆失败')
# exit()
# print('登陆成功之后可以做很多很多操作')
最新文章
- Something about Linux
- Python scikit-learn机器学习工具包学习笔记:feature_selection模块
- 30、准确计算CoreText高度的方法
- .Net事件管道详解图
- JDBC链接MySQL和Oracle
- codeforces 615D - Multipliers
- JMeter入门(4):Java Request实例
- bzoj4447 SCOI2015 小凸解密码 password
- python学习===判断两个日期的间距天数
- Oracle Start With关键字
- JAVA_SE基础——50.接口关系下的多态
- 笔记,ajax,事件绑定,序列化
- web工程迁移---在一个jboss5或jboss6中运行多个实例
- Python代码注释应该怎么写?
- AccessText热键的使用
- select 实现多路复用IO的server_socket
- 高可用OpenStack(Queen版)集群-3.高可用配置(pacemaker&;haproxy)
- MyEclipse开发Rest服务入门
- SimpleDateFormat格式化日期以及日期的相关操作
- linq的左连接右连接内连接用法
热门文章
- 画多边形form并填充背景色(可以实现圆角边框 有锯齿)
- Magento 2.2.5和2.2.6的bug 产品设置special price又删除后价格排序有误
- 浏览器解析JavaScript的原理
- bzoj 3513: [MUTC2013]idiots FFT
- spring事务的7种传播行为
- Numpy 基础
- IDEA Maven项目的Mybatis逆向工程
- python打包exe
- 自定义 Cordova插件详解
- LINQ to Entities 不识别方法“System.DateTime AddDays(Double)