python网络编程3-socketserver模块

一、复习

# 解决黏包问题
#为什么会出现黏包问题# 首先只有在TCP协议中才会出现黏包现象# 是因为TCP协议是面向流的协议# 在发送的数据传输过程中有缓存机制来避免数据丢失# 因此在连续发送小数据的时候,以及接收大小不符的时候都容易出现尿包现象# 本质还是因为我们在接收数据时不清楚发送数据的长短
# 解决黏包问题# 在传输大量数据之前先告诉接收端要发送的数据大小# 或者通过struct模块来定制协议
# struct模块#pack unpack# 模式‘i’# pack后的长度:4个字节# unpack后的数据是元组:元组的第一个元素才是pack的值

二、hmac加密问题

import hmac
h=hmac.new()   # secrect_key,你想进行加密的bytes
h.digest()  #密文的内容
hmac.compare_digest()  #对比 密文 另外一个密文

 例 验证客户端的合法性

server:

import socket
import os
import hmac
# os.urandom(32)  # 随机生成32位字节
def check_conn(conn):msg=os.urandom(32)  # 随机一段内容conn.send(msg)h=hmac.new(secrect_key,msg)digest=h.digest()client_digest=conn.recv(1024)return hmac.compare_digest(digest,client_digest)secrect_key=b'egg'
sk=socket.socket()
sk.bind(('127.0.0.1',8080))
sk.listen()conn,addr=sk.accept()
res=check_conn(conn)
if res:print('合法客户端')conn.close()
else:print('不合法客户端')conn.close()
sk.close()

client:

import socket
import hmacsecret_key=b'egg'
sk=socket.socket()
sk.connect(('127.0.0.1',8080))
msg=sk.recv(1024)
h=hmac.new(secret_key,msg)
digest=h.digest()
sk.send(digest)

三、socketserver模块

server:

# socket tcp服务 同一时间只能和同一个客户通信
# socketserver tcp服务 同一时间和多个客户通信import socketserverclass MyServer(socketserver.BaseRequestHandler):def handle(self): #self.request 就相当于connwhile True:msg=self.request.recv(1024).decode('utf-8')if msg=='q':breakprint(msg)info=input('%s>>>'%msg[:2])self.request.send(info.encode('utf-8'))if __name__ =='__main__':server=socketserver.ThreadingTCPServer(('127.0.0.1',8080),MyServer)# thread 线程 一个程序只有一个线程 一个线程就是调度cpu的最小单位# 只有用线程才能占用cpuserver.serve_forever()# bind、listen
# conn,addr=accept
# self.request=conn
# socket_server
#看源码方法:
#   第一 多个类之间的继承关系要先整理
#   每一个类中的方法,要大致列出来
# 所有的self对象调用要清楚的了解 到底是谁的对象
# 所有的方法调用要退回到最子类的类中开始寻找,逐级查看

client1:

import  socket
sk=socket.socket()
sk.connect(('127.0.0.1',8080))
while True:msg=input('>>>')if msg=='q':sk.send(b'q')breaksk.send(('大众点评:'+msg).encode('utf-8'))ret=sk.recv(1024).decode('utf-8')print(ret)
sk.close()

client2:

import  socket
sk=socket.socket()
sk.connect(('127.0.0.1',8080))
while True:msg=input('>>>')if msg=='q':sk.send(b'q')breaksk.send(('美团:' + msg).encode('utf-8'))ret=sk.recv(1024).decode('utf-8')print(ret)
sk.close()

运行结果:

 

 参考自https://www.cnblogs.com/Eva-J/articles/8244551.html#_label5

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/568334.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【测试】测试开发成长学习路线--引导篇

转载自:https://blog.csdn.net/u011541946/article/details/73382294 我相信,有很多测试人员会不断问自己,自己到底要不要坚持做测试,测试的职业发展到底怎么样?如果你还在迷茫,在到处找各种大牛问类似的问…

【Jmeter篇】jmeter Ant Jenkins接口自动化测试集成之半路逆转(二)

一、更改方案 由于上一篇文章【Jmeter篇】jmeterAntJenkins实现自动化测试集成(一)https://blog.csdn.net/qq_36502272/article/details/102682966中build.xml在cmd下执行ant正常且生成jtl文件和html文件,但是在jenkins构建多次一直失败&…

pycharm无法导入本地模块问题

导入语句: 办法一 根本不起作用 办法二: 在python安装位置的D:\usedtool\python\Lib\site-packages下建立一个.pth文件 里面把项目地址写上: 最后运行程序。虽然有红线但是运行无误。。搞定

【Jmeter篇】jmeter+Ant+Jenkins接口自动化测试集成之报告优化(三)

增加更加详细测试报告及优化jenkins测试报告样式显示 1、下载优化模板 jmeter-results-shanhe-me.xsl,拷贝到jmeter的C:\jmeter\apache-jmeter-5.0\extras目录中 2、设置测试输出报告要输出的内容:同样在jmeter.properties中,设置需要输出的…

3333

一、安装Email Ext Recipients Column Plugin和Email Extension Plugin插件 二、设置QQ邮箱授权码 https://service.mail.qq.com/cgi-bin/help?subtype1&&id28&&no1001256 三、系统管理-系统设置 1、Jenkins Location设置主机名和系统管理员邮件地址 2、Ex…

【JMeter】Threads(users)3种类型

线程(用户)Threads(Users) :线程组元件是任何一个测试计划的开始点。在一个测试计划中的所有元件都必须在某个线程下。所有的任务都是基于线程组。 有三种类型:分别代表测试准备工作,测试执行,测试完成后操…

python __new__中单例的作用

__new__() 方法的特性: __new__() 方法是在类准备将自身实例化时调用。__new__() 方法始终都是类的静态方法,即使没有被加上静态方法装饰器。类的实例化和它的构造方法通常都是这个样子: class MyClass(object):def __init__(self, *args, *…

【JMeter】Thread Group下的组件Sampler取样器

我们创建了线程组Thread Group后,会在它下面add组件Sampler取样器。 1. 取样器用来向服务器发送请求,记录响应信息,响应时间的最小单元。 2. 用监听器可以查看取样结果,也可以结合断言进一步验证响应接口是否符合预期。 3. 取样器…

python并发编程1-进程

主进程和子进程 运行结果: 一旦进程创建后,进程就由操作系统调度 代码解析: 子进程与父进程 所以主进程的父进程就是pycharm args传参 一个参数 两个参数 join作用(创建多个线程): 不一定哪个进程先执行…

python并发编程2-进程

一、信号量 # 多进程中的组件 # ktv # 4个 # 一套资源 同一时间 只能被n个人访问 # 某一段代码 同一时间 只能被n个进程执行from multiprocessing import Process,Semaphore import time import random def ktv(i,sem):sem.acquire()print(%s走进ktv %i)time.sleep(random.ran…

Python Pytest装饰器@pytest.mark.parametrize用例数据驱动(三)

一、测试用例用excel管理,存放地址:C:\Users\wangli\PycharmProjects\Test\test\files\apiCase.xls 二、代码实现如下: 1、封装读取excel用例数据 2、Pytest装饰器pytest.mark.parametrize(参数名,list)实现登录模块2条测试用例数据驱动 im…

python并发编程3-进程

复习: # 锁 # 多个进程在同一时间只有一个进程能进入代码去执行# 信号量 Semaphore from multiprocessing import Semaphore # 用锁的原理实现的。内置了一个计数器 #在同一时间 只能有指定数量的进程执行某一段被控制住的代码#事件 # wait阻塞收到事件状态控制的同…

python并发编程4-线程

进程的出现 原来一台服务器只能执行一个任务。 进程的出现,可以让一台服务器处理多个任务。多个任务间进行切换,记录每个任务当前执行到哪里,记录有哪些数据。然后进行切换 每个进程区分开每个任务所能占有的内存空间 进程的缺点 线程的出现…

【Fiddler篇】FreeHttp无限篡改http报文数据调试和mock服务

目录 引言 FreeHttp起源 FreeHttp 插件安装FreeHttp 基本界面一:规则匹配区 1.1:『get http sesion in left session list』获取Session信息1.2:『select url filter method』Url匹配方式1.3:『edit advanced http filter』高级匹…

echarts实现双Y轴之散点和折线图

代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"utf-8"><title></title><script src"echarts.js"></script> </head><body><div id"box" st…

python列表对应元素合并为列表及判断一个列表是几维

一、合并对应元素 1、两个列表合并 a[1,2,3,4,5] b[2,3,4,5,6] d[] for i in range(len(a)):c []c.append(a[i])c.append(b[i])d.append(c) print(d) 运行结果&#xff1a; 2、一个列表垂直合并 3、一个列表顺序合并 date[] date_temp1[1545225954.721;1545225955.115, …

Pytest脚本中运行用例方式

脚本树如下&#xff1a; test1文件下test_01.py存放test1和test2用例 test1文件下test_02.py存放test1和test2用例 test2文件下test_03.py存放test1和test2用例 test2文件下test_04.py存放test1和test2用例 1、运行所有用例 import pytest if __name__ "__main__&quo…

js 获取当前元素的父元素的父元素的id

情景一&#xff1a;用onclick触发的函数 html代码&#xff1a; <div id"0" style"border-bottom:1px solid #000;margin:0 auto;"><div>1111</div><div class"original"><div id"chartx1" class"cha…

echarts图使用tab和下拉切换

方法一&#xff1a;用tab建切换 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><script type"text/javascript" src"jquery-1.12.4.min.js"></scr…

使用securecrt在本地与服务器之间上传下载数据

第一种方式&#xff1a; 1、首先安装&#xff1a;apt install lrzsz lrzsz是一款在Linux里可代替ftp上传和下载的程序。 2、设置上传和下载目录&#xff1a;选项--》会话选项--》X/Y/Zmodem 中设置上传和下载目录 3、上传和下载 上传文件只需在shel中输入命令"rz"…