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也是 ...
随机推荐
- 条件编译ifndef、ifdef、endif
1.条件编译命令最常见的形式为: #ifdef 标识符 程序段1 #else 程序段2 #endif 当标识符已经被定义过(一般是用#define命令定义),则对程序段1进行编译,否则编译程序段2. ...
- Python compile() 函数
Python compile() 函数 Python 内置函数 描述 compile() 函数将一个字符串编译为字节代码. 语法 以下是 compile() 方法的语法: compile(sourc ...
- PAT1131(dfs)
In the big cities, the subway systems always look so complex to the visitors. To give you some sense ...
- PAT1021(dfs 连通分量)
A graph which is connected and acyclic can be considered a tree. The height of the tree depends on t ...
- 不要62(数位DP)
不要62 http://acm.hdu.edu.cn/showproblem.php?pid=2089 Time Limit: 1000/1000 MS (Java/Others) Memory ...
- ACM-ICPC 2018 南京赛区网络预赛 G. Lpl and Energy-saving Lamps(二分+线段树区间最小)
During tea-drinking, princess, amongst other things, asked why has such a good-natured and cute Drag ...
- f5 Syslog管理
1.本地log保存7天.可输出至syslog服务器 local traffic 对应ltm
- jsp选项过长自动换行
自动换行前是这样的 从源码发现“打发的所发生的7”所在span跨行了,宽度为整行的宽度,不再是自身的实际宽度(一列时所占的宽度) 我的思路是要把这个换行元素前加上<br/>,使得该元素换行 ...
- java 基础之--nio 网络编程
在传统的Java 网络编程中,对于客户端的每次连接,对于服务器来说,都要创建一个新的线程与客户端进行通讯,这种频繁的线程的创建,对于服务器来说,是一种巨大的损耗,在Java 1.4 引入Java ni ...
- Linux配置Nginx负载均衡
nginx配置负载均衡其实很简单,一直还以为负载均衡是个很高端人士玩的 首先先了解下负载均衡,假设一个场景,如果有1000个客户同时访问你服务器时,而你只有一台服务器的Nginx,且只有一个MySQL ...