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 ...
随机推荐
- 树莓派raspberry pi配置无线路由器AP
raspi-config进入系统配置面板 进行 Expand Filesystem 扩展文件系统否则备份系统的时候备份文件会急速膨胀. (1)配置网络环境nano /etc/network/inte ...
- oralce 11.2.0.4手动创建EM
安装完oracle,启动dbconsole,失败 [oracle@elearning admin]$ emctl start dbconsole OC4J Configuration issue. / ...
- Pinterest凭什么拥有那么多用户:机器学习是答案
目前,Pinterest月平均活跃用户量达到1亿,这家以图片为主的公司是如何留住用户并盈利的呢?Pinterest的主要目标是向用户推荐相关的图片或内容,推荐的内容足够精确才能提高用户黏性.近期,&l ...
- Effective Java 第三版——75. 在详细信息中包含失败捕获信息
Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...
- 使用phpstorm进行PHP断点调试
PHP开发中都说一个会偷懒的程序员才是合格的程序员,在PHP开发中调试是必须要有的,可能要重复很多次的去调试,一次又一次,今天我们就来教教大家如何偷懒的,那么就来讲讲使用phpstorm进行偷懒吧! ...
- 15.翻译系列:EF 6中的级联删除【EF 6 Code-First 系列】
原文链接:https://www.entityframeworktutorial.net/code-first/cascade-delete-in-code-first.aspx EF 6 Code- ...
- mysql视图详解 mysql视图
目录 22.1. ALTER VIEW语法 22.2. CREATE VIEW语法 22.3. DROP VIEW语法 22.4. SHOW CREATE VIEW语法 本章讨论了下述主题: · ...
- spring 整合junit进行测试
如果想让junit和spring容器环境无缝对接的话,可以使用如下方式: import com.jd.ptest.service.ICronService; import org.junit.Test ...
- csproj文件中copy指令的使用方式
实际开发中有很多项目需要引用第三方的dll或者资源文件,且文件比较多,在运行时这些文件需要被拷贝到BIN目录. 使用VS自带的"复制到输出目录",似然方便,但是比较不零活,经过多次 ...
- C++ 智能指针七
/* 智能指针weak_ptr */ #include <iostream> #include <string> #include <memory> /* weak ...