一.socketserver模块

  1.sockeserver的源码流程

  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模块实现并发和连接合法性验证的更多相关文章

  1. 验证客户端的链接合法性和socketserver模块实现并发

    本节内容: 1.验证客户端的链接合法性 2.socketserver模块实现并发 一.验证客户端的链接合法性 首先,我们来探讨一下,什么叫验证合法性, 举个例子:有一天,我开了一个socket服务端, ...

  2. [并发编程 - socketserver模块实现并发、[进程查看父子进程pid、僵尸进程、孤儿进程、守护进程、互斥锁、队列、生产者消费者模型]

    [并发编程 - socketserver模块实现并发.[进程查看父子进程pid.僵尸进程.孤儿进程.守护进程.互斥锁.队列.生产者消费者模型] socketserver模块实现并发 基于tcp的套接字 ...

  3. Python进阶----UDP协议使用socket通信,socketserver模块实现并发

    Python进阶----UDP协议使用socket通信,socketserver模块实现并发 一丶基于UDP协议的socket 实现UDP协议传输数据 代码如下:

  4. tcp上传大文件举例、udp实现qq聊天、socketserver模块实现并发

    为什么会出现粘包现象(day31提到过,这里再举个例子) """首先只有在TCP协议中才会出现粘包现象,因为TCP协议是流式协议它的特点是将数据量小并且时间间隔比较短的数 ...

  5. udp套接字及利用socketserver模块实现并发以及并发编程

    一:基于udp协议(数据报协议)的套接字:和tcp协议的套接字对比而言,由于udp是无链接的,所以先启动哪一端都不会报错,而且udp也不会有粘包 现象,所以对比下来,tcp协议的话传输数据更加可靠,但 ...

  6. 基于socketserver模块实现并发的套接字(tcp、udp)

    tcp服务端:import socketserver class MyHandler(socketserver.BaseRequestHandler): def handle(self): #通信循环 ...

  7. 网络编程协议(TCP和UDP协议,黏包问题)以及socketserver模块

    网络编程协议 1.osi七层模型 应用层  表示层  会话层  传输层  网络层  数据链路层  物理层 2.套接字 socket 有两类,一种基于文件类型,一种基于网络类型 3.Tcp和udp协议 ...

  8. 网络编程协议(TCP和UDP协议,粘包问题)以及socketserver模块

    网络编程协议 1.osi七层模型 应用层  表示层  会话层  传输层  网络层  数据链路层  物理层 2.套接字 socket 有两类,一种基于文件类型,一种基于网络类型 3.Tcp和udp协议 ...

  9. 网络编程进阶---->>> hamc模块 socketserver模块验证合法性 两者进行通信连接

    我们在工作中经常遇到,你公司内的某一台电脑要去访问你的服务器或者一个服务端电脑,那么你是让每一台都进行连接吗?  那不可能的  你肯定要进行限定的 验证客户端链接的合法性: hamc模块 hamc也是 ...

随机推荐

  1. codeblocks安装(自带gcc编译器)

    下载安装自带c编译器的的codeblocks. 网址:http://www.codeblocks.org/downloads/26 自带gcc编译器的版本 codeblocks-16.01mingw- ...

  2. ASCII码翻译方法可直接使用谷歌

    ASCII码翻译方法可直接使用谷歌. 如: key{you are right} 将此段ASCII码输入谷歌搜索栏,直接翻译结果:    

  3. 服务器使用VMware系软件管理主机集群

    在服务器安装ESXI 6.0系统,此系统300多M,用于管理服务器上的主机. 其他主机安装个vsphere client连接后可ESXI系统可进行简单管理 如果要更强大的功能,需要安装vcenter ...

  4. vue 父组件使用子组件中的data或methods

    1.调用子组件的时候 定义一个ref 2.在父组件里面通过 this.$refs.verify.属性 this.$refs.verify.方法

  5. java_11接口

    1接口的概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”. 接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成.这样将功能的定义 ...

  6. Head First Servlets & JSP 学习笔记 第一章 —— 前言和体系结构

    URL,Uniform Resource Locatiors,统一资源定位符. http:// www.wickedlysmart.com :80 /beeradivice/select /beer1 ...

  7. centos7 二进制版本安装 mysql8.0.13

    一.下载mysql二进制安装包 mysql官网: https://dev.mysql.com/downloads/mysql/ 由于国内网络问题,个人建议使用国内开源镜像站下载: http://mir ...

  8. 开启Windows文件共享必须开启的两个服务

    开启Windows文件共享必须开启的两个服务分别是: 1.Server服务. 2.Workstation服务. 如果文件共享丢失,可以去首先去查看这两个服务是否停止,如果停止,请启动或者重启.

  9. Jmeter常用脚本开发之Debug Sampler

    Debug Sampler编辑脚本时调试用的,跟Java项目打断点测试同理,它可以Debug Jmeter中所有自定义变量的值 如何添加Debug Sampler? 打开测试计划—>线程组—&g ...

  10. nvl 与 nvl2

    NVL函数 Oracle/PLSQL中的一个函数. 格式为: NVL( string1, replace_with) 功能:如果string1为NULL,则NVL函数返回replace_with的值, ...