socketserver模块实现并发和连接合法性验证
一.socketserver模块
2.简单的使用
socketserver服务端
import socketserver
class MyServer(socketserver.BaseRequestHandler):
def handle(self):
msg = self.request.recv(1024)
print(msg)
if __name__ == '__main__':
server = socketserver.ThreadingTCPServer(("127.0.0.1",8888),MyServer) # 实例化对象
server.serve_forever()
socket客户端
import socket client = socket.socket()
ip_port = ("127.0.0.1",8888)
client.connect(ip_port) client.send(b"hello")
二.连接的合法性验证
1.os.urandom(n)加密
os.urandom(n)是一种bytes类型的随机生成n个字节字符串,而且每次生成的值都不相同,再加上md5等加密处理,就成了内容不同长度相同的字符串了
2.hmac
python自带的hmac模块实现了标准的Hmac算法
import hmac
message = b'Hello world' # 加密信息
key = b'secret' # 加密密匙
h = hmac.new(key,message,digestmod='MD5') # 密匙,信息,模式
print(h.hexdigest())
比较两个密文是否相同,可以用hmac.compare_digest(密文、密文),返回True或者False。
3.连接合法性验证服务端和客户端
服务端
import socket
import hmac , os secret_key = b"This is key!" # 只做验证 返回bool
def conn_auth(conn):
print("连接认证") msg = os.urandom(32)
conn.send(msg)
h = hmac.new(secret_key,msg)
server_key = h.digest()
client_key = conn.recv(32)
# print(server_key,client_key) return hmac.compare_digest(server_key,client_key) # 判断验证
def data(conn): if conn_auth(conn):
print("验证成功!")
conn.send("验证成功".encode("utf-8"))
while 1:
data = conn.recv(1024)
print(data) else:
print("验证失败")
conn.send("验证失败".encode("utf-8"))
conn.close()
return # 启动
def tcp_server(ip_port,): server = socket.socket()
server.bind(ip_port)
server.listen()
while 1:
conn,addr = server.accept()
print(f"新连接: {addr[0]}:{addr[1]}")
data(conn) if __name__ == '__main__':
ip_port = ("127.0.0.1",8888)
tcp_server(ip_port)
客户端
import socket
import os, hmac # 密匙
sercet_key = b"This is key!" # 使用密匙验证连接是否合法
def conn_auth(client):
msg = client.recv(32)
h = hmac.new(sercet_key, msg)
client_key = h.digest()
client.send(client_key) # 验证判断
def tcp_client(ip_port):
client = socket.socket()
client.connect(ip_port)
conn_auth(client)
verify = client.recv(12).decode("utf-8") while verify == "验证成功":
data = input("给服务端发送:").encode("utf-8")
client.send(data) else:
print("连接被拒绝")
client.close() if __name__ == '__main__':
ip_port = ("127.0.0.1", 8888)
tcp_client(ip_port)
socketserver模块实现并发和连接合法性验证的更多相关文章
- 验证客户端的链接合法性和socketserver模块实现并发
本节内容: 1.验证客户端的链接合法性 2.socketserver模块实现并发 一.验证客户端的链接合法性 首先,我们来探讨一下,什么叫验证合法性, 举个例子:有一天,我开了一个socket服务端, ...
- [并发编程 - socketserver模块实现并发、[进程查看父子进程pid、僵尸进程、孤儿进程、守护进程、互斥锁、队列、生产者消费者模型]
[并发编程 - socketserver模块实现并发.[进程查看父子进程pid.僵尸进程.孤儿进程.守护进程.互斥锁.队列.生产者消费者模型] socketserver模块实现并发 基于tcp的套接字 ...
- Python进阶----UDP协议使用socket通信,socketserver模块实现并发
Python进阶----UDP协议使用socket通信,socketserver模块实现并发 一丶基于UDP协议的socket 实现UDP协议传输数据 代码如下:
- tcp上传大文件举例、udp实现qq聊天、socketserver模块实现并发
为什么会出现粘包现象(day31提到过,这里再举个例子) """首先只有在TCP协议中才会出现粘包现象,因为TCP协议是流式协议它的特点是将数据量小并且时间间隔比较短的数 ...
- udp套接字及利用socketserver模块实现并发以及并发编程
一:基于udp协议(数据报协议)的套接字:和tcp协议的套接字对比而言,由于udp是无链接的,所以先启动哪一端都不会报错,而且udp也不会有粘包 现象,所以对比下来,tcp协议的话传输数据更加可靠,但 ...
- 基于socketserver模块实现并发的套接字(tcp、udp)
tcp服务端:import socketserver class MyHandler(socketserver.BaseRequestHandler): def handle(self): #通信循环 ...
- 网络编程协议(TCP和UDP协议,黏包问题)以及socketserver模块
网络编程协议 1.osi七层模型 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 2.套接字 socket 有两类,一种基于文件类型,一种基于网络类型 3.Tcp和udp协议 ...
- 网络编程协议(TCP和UDP协议,粘包问题)以及socketserver模块
网络编程协议 1.osi七层模型 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 2.套接字 socket 有两类,一种基于文件类型,一种基于网络类型 3.Tcp和udp协议 ...
- 网络编程进阶---->>> hamc模块 socketserver模块验证合法性 两者进行通信连接
我们在工作中经常遇到,你公司内的某一台电脑要去访问你的服务器或者一个服务端电脑,那么你是让每一台都进行连接吗? 那不可能的 你肯定要进行限定的 验证客户端链接的合法性: hamc模块 hamc也是 ...
随机推荐
- codeblocks安装(自带gcc编译器)
下载安装自带c编译器的的codeblocks. 网址:http://www.codeblocks.org/downloads/26 自带gcc编译器的版本 codeblocks-16.01mingw- ...
- ASCII码翻译方法可直接使用谷歌
ASCII码翻译方法可直接使用谷歌. 如: key{you are right} 将此段ASCII码输入谷歌搜索栏,直接翻译结果:
- 服务器使用VMware系软件管理主机集群
在服务器安装ESXI 6.0系统,此系统300多M,用于管理服务器上的主机. 其他主机安装个vsphere client连接后可ESXI系统可进行简单管理 如果要更强大的功能,需要安装vcenter ...
- vue 父组件使用子组件中的data或methods
1.调用子组件的时候 定义一个ref 2.在父组件里面通过 this.$refs.verify.属性 this.$refs.verify.方法
- java_11接口
1接口的概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”. 接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成.这样将功能的定义 ...
- Head First Servlets & JSP 学习笔记 第一章 —— 前言和体系结构
URL,Uniform Resource Locatiors,统一资源定位符. http:// www.wickedlysmart.com :80 /beeradivice/select /beer1 ...
- centos7 二进制版本安装 mysql8.0.13
一.下载mysql二进制安装包 mysql官网: https://dev.mysql.com/downloads/mysql/ 由于国内网络问题,个人建议使用国内开源镜像站下载: http://mir ...
- 开启Windows文件共享必须开启的两个服务
开启Windows文件共享必须开启的两个服务分别是: 1.Server服务. 2.Workstation服务. 如果文件共享丢失,可以去首先去查看这两个服务是否停止,如果停止,请启动或者重启.
- Jmeter常用脚本开发之Debug Sampler
Debug Sampler编辑脚本时调试用的,跟Java项目打断点测试同理,它可以Debug Jmeter中所有自定义变量的值 如何添加Debug Sampler? 打开测试计划—>线程组—&g ...
- nvl 与 nvl2
NVL函数 Oracle/PLSQL中的一个函数. 格式为: NVL( string1, replace_with) 功能:如果string1为NULL,则NVL函数返回replace_with的值, ...