python全栈开发 * 35 知识点汇总 * 180720
35 socket 一些常用方法 验证客户端信息 添加随机字符串 socketserver模块
一.socket模块中一些常用方法
1.send和sendall的区别
2.conn.getpeername conn/ sk.getsockname
3.setsockopt() 3.getsockopt()
4.sk.setblocking()
5.settimeout() gettimeout() 二.客户端验证相关事宜
第一版 验证客户端
服务器:
import socket
import hashlib
sk=socket.socket()
sk.bind(("127.0.0.1",8809))
sk.listen()
conn,addr=sk.accept()
key="天王盖地虎"
ch="你好"
conn.send(ch.encode("utf-8"))
md5_obj=hashlib.md5(key.encode("utf-8"))
md5_obj.update(ch.encode("utf-8"))
re=md5_obj.hexdigest()
client_re=conn.recv(1024).decode("utf-8")
if re==client_re:
print("你好,老铁")
else:
print("你是假冒用户")
conn.close()
sk.close()
客户端:
import socket
import hashlib
sk=socket.socket()
sk.connect(("127.0.0.1",8809))
key="天王盖地虎" #宝塔镇河妖
ch=sk.recv(1024)
md5_obj=hashlib.md5(key.encode("utf-8"))
md5_obj.update(ch)
re=md5_obj.hexdigest()
sk.send(re.encode("utf-8")) sk.close()
第二版 添加随机字符串
服务器 (import os os.urandom(num))
import socket
import hashlib
import os
sk=socket.socket()
sk.bind(("127.0.0.1",8809))
sk.listen()
conn,addr=sk.accept()
key="天王盖地虎"
ch=os.urandom(10) #===>字节
conn.send(ch)
md5_obj=hashlib.md5(key.encode("utf-8"))
md5_obj.update(ch)
re=md5_obj.hexdigest() #===>字符串
client_re=conn.recv(1024).decode("utf-8")
if re==client_re:
print("你好,老铁")
else:
print("你是假冒用户")
conn.close()
sk.close()
客户端
import socket
import hashlib
sk=socket.socket()
sk.connect(("127.0.0.1",8809))
key="天王盖地虎" #宝塔镇河妖
ch=sk.recv(1024)
print(ch)
md5_obj=hashlib.md5(key.encode("utf-8")) #(括号里应该是字节)
md5_obj.update(ch) #(括号里应该是字节)
re=md5_obj.hexdigest() #====>字节
sk.send(re.encode("utf-8")) sk.close()
第三版 用hmac加密方法
服务器
import socket
import hmac #hmac 模块 (内置模块)
import os
sk=socket.socket()
sk.bind(("127.0.0.1",8809))
sk.listen()
conn,addr=sk.accept()
key="天王盖地虎" # 加盐
ch=os.urandom(10) # os中的urandom方法(获取随机字符串) ===>字节
conn.send(ch) #字节可以直接发送,无需编码
obj=hmac.new(key.encode("utf-8"),ch) #模块hmac中的new方法给随机字符串 ch 加密赋值给obj
re=obj.digest() #=====>直接返回Bytes类型
# md5_obj=hashlib.md5(key.encode("utf-8"))
# md5_obj.update(ch)
# re=md5_obj.hexdigest() #===>字符串
client_re=conn.recv(1024)
if re==client_re:
print("你好,老铁")
else:
print("你是假冒用户")
conn.close()
sk.close() 客户端
import socket
import hmac # 内置模块hmac
sk=socket.socket()
sk.connect(("127.0.0.1",8809))
key="天王盖地虎" # 加盐
ch=sk.recv(1024) #接收到服务器发来的随机字符串 字节形式
obj=hmac.new(key.encode("utf-8"),ch) #用模块hmac中的new方法给随机字符串加密,括号里必须都是字节形式
re=obj.digest() #返回字节形式
# md5_obj=hashlib.md5(key.encode("utf-8")) #(括号里应该是字节)
# md5_obj.update(ch) #(括号里应该是字节)
# re=md5_obj.hexdigest() #====>字符串
sk.send(re) # 直接发送给服务器 三.socketserver模块tcp中一个服务器同时连接多个客户端
服务器
客户登陆验证
import socketserver
import json
import hashlib
class Myserver(socketserver.BaseRequestHandler):
def handle(self):
dic_str=self.request.recv(1024).decode("utf-8")
dic=json.loads(dic_str)
with open("user_info",encoding="utf-8")as f:
for i in f:
username,password=i.split("|")
if username==dic["username"]:
md5_obj=hashlib.md5(dic["username"].encode('utf-8'))
md5_obj.update(dic["password"].encode("utf-8"))
re=md5_obj.hexdigest()
if re == password.strip():
self.request.send(b'success')
else:
self.request.send(b'failed')
break
else:
self.request.send("用户名不存在".encode("utf-8")) server=socketserver.TCPServer(("127.0.0.1",8810),Myserver)
server.serve_forever()
客户端
import socket
import json
import time sk=socket.socket()
sk.connect(("127.0.0.1",8810)) dic={"username":None,"password":None}
while 1:
username=input("姓名:")
password=input("密码:")
dic["username"]=username
dic["password"]=password
dic_str=json.dumps(dic)
sk.send(dic_str.encode("utf-8"))
print(sk.recv(1024))
python全栈开发 * 35 知识点汇总 * 180720的更多相关文章
- python全栈开发 * 10知识点汇总 * 180612
10 函数进阶 知识点汇总 一.动态参数 形参的第三种1.动态接收位置传参 表达:*args (在参数位置编写 * 表⽰接收任意内容) (1)动态位置参数def eat(*args): print(a ...
- python全栈开发 * 32知识点汇总 * 180717
32 网络编程 (一)一.架构 定义:程序员开发的一种模式. 分类: C/S 架构 C/S即:Client与Server , 客户端/ 服务器模式 . 缺点 : 冗余 B/S 架构 Browser与S ...
- python全栈开发 * 01知识点汇总 * 180530
一 python简介. 1.创始人: 吉多 .范罗苏姆 \ (Guido van Rossum). 2.时间 : 1989年. 3.主要应用领域 : 云计算 \ WEB开发 \ ...
- python全栈开发 * 26知识点汇总 * 180709
26 logging collections random 模块 一.logging低配:日志不能写入文件与显示同时进行 import logging logging.basicConfig(leve ...
- python全栈开发 * 12 知识点汇总 * 180530
12 知识点总结 装饰器进阶 ⼀. 通⽤装饰器的回顾1.开闭原则: 对增加功能开放. 对修改代码封闭2.装饰器的作⽤: 在不改变原有代码的基础上给⼀个函数增加功能3.通⽤装饰器的写法:def wrap ...
- python全栈开发 * 36知识点汇总 * 180721
36 操作系统的发展史 进程一.手工操作--穿孔卡片 1.内容: 程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把程序和数据输入计算机内存,接着通过控制 台开关启动程序针对 ...
- python全栈开发 * 33 知识点汇总 * 180718
33 udp协议编码 显示客户端名字,输出带颜色的内容 udp协议的时间同步机制 #一.udp 协议编码 一个服务器,多个客户端#服务器:# import socket# sk=socket.sock ...
- python全栈开发 * 31知识点汇总 * 180716
31 模块和包一.模块(一)模块的种类:内置模块,自定义模块,扩展模块第三方模块(二)自定义模块 1.模块的创建 : 新建一个py文件. 2.模块名 : 模块名需要符合变量的命名规范. 3.模块的导入 ...
- python全栈开发 * 24 知识点汇总 * 180705
24 模块-------序列化一.什么是模块 模块:py文件就是一个模块.二.模块的分类:(1)内置模块 (登录模块,时间模块,sys模块,os模块)(2)扩展模块 (itchat 微信有关,爬虫,b ...
随机推荐
- 评分卡模型剖析之一(woe、IV、ROC、信息熵)
信用评分卡模型在国外是一种成熟的预测方法,尤其在信用风险评估以及金融风险控制领域更是得到了比较广泛的使用,其原理是将模型变量WOE编码方式离散化之后运用logistic回归模型进行的一种二分类变量的广 ...
- npm安装教程
一.使用之前,我们先来掌握3个东西是用来干什么的. npm: Nodejs下的包管理器. webpack: 它主要的用途是通过CommonJS的语法把所有浏览器端需要发布的静态资源做相应的准备,比如资 ...
- springboot 项目中读取资源文件内容 如图片、文档文件
1 问题描述:在 springboot 项目中有时候会需要读取一些资源文件,例如 office的 docx 文档或者 png.jpg的图片.在多模块项目中资源文件需要放到启动项目的 Resources ...
- MAC Gradle 下载的问题
1.项目中 gradle/wrapper/gradle-wrapper.properties 中的变量 GRADLE_USER_HOME 可以在 ~/.bash_profile 中配置, 设置为 GR ...
- JS 日期补0
js日期需要yyyy-mm-dd的时候只显示yyyy-m-d,需要前面补充0,之前都是用的判断,感觉非常low.刚刚看到一个方法padStart用了用还不错,padStart是为数值补全指定位数,对应 ...
- 和李洪强一起学设计01 PS第一天
和李洪强一起学设计01 PS第一天
- 12款 JavaScript 表格控件(DataGrid)
JavaScript 表格控件可以操作大数据集的 HTML表格,提供各种功能,如分页.排序.过滤以及行编辑.在本文中,我们整理了13个最好的 JavaScript 表格插件分享给开发人员,开发者可以很 ...
- idea maven 集成多模块 module
首先第一步创建 顶级项目 也就是父项目 在创面那部中 不管你勾不勾 create from 那个选项 都无所谓,最终创建的项目要全删的 ,只保留pom.xml 父项目结构 接下来 创建子项目 也是 ...
- 【iCore4 双核心板_ARM】例程三十二:UART_IAP_ARM实验——更新升级STM32
实验现象及操作说明: 1.本例程共有两个代码包,APP和IAP,IAP程序功能实现将APP程序升级至STM32中. 2.直接上电或烧写程序将执行升级的APP应用程序. BIN升级文件产生方法: 1.编 ...
- C语言 · 还款计算
标题: 还款计算 银行贷款的等额本息还款方法是: 每月还固定的金额,在约定的期数内正好还完(最后一个月可能会有微小的零头出入). 比如说小明在银行贷款1万元.贷款年化利率为5%,贷款期限为24个月. ...