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 ...
随机推荐
- [Python设计模式] 第18章 游戏角色备份——备忘录模式
github地址:https://github.com/cheesezh/python_design_patterns 题目 用代码模拟以下场景,一个游戏角色有生命力,攻击力,防御力等数据,在打Bos ...
- C#使用HttpWebRequest和HttpWebResponse上传文件示例
C#使用HttpWebRequest和HttpWebResponse上传文件示例 1.HttpHelper类: 复制内容到剪贴板程序代码 using System;using System.Colle ...
- PowerShe 消息提示框测试
1. 使用powerShell 弹出一个简单的消息框,代码如下,创建test.ps1脚本文件. $ConfirmPreference = 'None' $ws = New-Object -ComObj ...
- 找不到指定的 VM 安装:类型 标准 VM,名称 jre7
问题背景是这样 原来使用的是jre7.0.55,后来为了安装使用 layabox IDE ,然后装了jdk_8u144 之后需要切换环境变量 之后java项目调试的时候重新设置了jdk,没问题. 直到 ...
- Use Dynamic Data Masking to obfuscate your sensitive data
Data privacy is a major concern today for any organization that manages sensitive data or personally ...
- 【转载 Hadoop&Spark 动手实践 2】Hadoop2.7.3 HDFS理论与动手实践
简介 HDFS(Hadoop Distributed File System )Hadoop分布式文件系统.是根据google发表的论文翻版的.论文为GFS(Google File System)Go ...
- 【Log】SLF4J简单入门
SLF4J介绍 SLF4J,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统.按照官方的说法,SLF4J是一个用于日 ...
- OLT、分光器、ONU直接的关系
- HAWQ配置之客户端访问
一.配置简单的口令访问 1,建立数据库和用户 postgres=# create database epbd; CREATE DATABASE postgres=# create role user1 ...
- pyCharm最新激活码(2018激活码)
首先输入新的License sever address 首先尝试处理方法是,针对过期会弹出激活框: 选择 Activate new license with License server (用lice ...