【黑马-python进阶】---学习笔记(6)---系统性能监控+基于TCP的Web服务器

2023-11-08

1 系统性能定时监控

1.1 系统监控概述

​ 用Python来编写脚本简化日常的运维工作是Python的一个重要用途,在Linux下,有许多系统命令可以时刻监控系统运行的状态;

1.2 psutil

​ **psutilpython system and process utilities缩写,python的系统监控及过程管理的工具,是一个功能强大的跨平台系统管理库。**可以实现命令行中类似ps,top,lsof,netstat,ifconfig,who,df,kill free,nice,ionice,iostant,iotop等等命令的功能,并且以python内置的数据结构形式返回;

1.3 常见功能

1.3.1 获取CPU信息

image-20220427215901216

1.3.2 获取内存信息

image-20220427220022704
image-20220427220032239

1.3.3 磁盘信息

  • 使用psutil类似于linux下的fdisk命令,磁盘的利用率以及I/O信息还有分区信息等
    image-20220427220119366

1.3.4 网络信息

image-20220427220336643

1.3.5 获得开机时间

image-20220427220356250
image-20220427220402850

1.3.6 小结

image-20220428151157010

1.4 系统性能定时监控

  • 功能描述(基础版)

1、显示当前服务器CPU的使用率;

2、显示当前服务器内存的使用率;

3、显示当前服务器硬盘的使用率;

4、显示当前服务器网络的收发情况;

5、显示CPU总核心数、总内存、总硬盘;

6、保存日志信息到log.txt文件中;

7、能够直接执行脚本,查看信息;

  • 功能描述(升级版)

1、能够定时显示监控数据
image-20220428152834338
image-20220428152841503

  • 如果是模块单独运行,就是__ name __== "__ __ main__"
  • 如果是被当做模块导入,就不能执行main()
    image-20220428153924281

1.4.1 yagmail模块发送邮件

  • yamail模块使用

实现自动发邮件功能
image-20220428155527035
image-20220505195751194
image-20220505195801251
image-20220505195811065

  • (3)空行

    • 用来分离请求头和请求数据,请求头到此结束!!的标志!!
  • (4)请求数据

    • 只有post方式提交的时候,才有请求数据!
      image-20220505195955704
  • 2、请求报文格式总结
    image-20220505200058406

  • 3、通过网络调试助手模拟TCP服务器,接收request请求

  • 4、小结

    • 请求报文格式
      • (1)请求行
        • 请求方式 资源路径 协议及版本
      • (2)请求头
        • 协议项
        • 协议名:协议值
      • (3)请求空行
        • 分割请求头和请求的主体
      • (4)请求主体
        • 浏览器要发给服务端的内容
        • GET方式没有请求体,POST方式有请求体

3 基于TCP的Web服务器

3.1模拟浏览器实现

  • 模拟浏览器请求web服务器的网页过程,使用TCP实现HTTP协议(请求报文格式和响应报文格式);
    image-20220506154007177
    image-20220506145628196
    image-20220506145641129
  • 返回的数据如下:(二进制)
    image-20220506155318013
  • 使用decode()解码后,内容如下:
    image-20220506155917962
  • 小结
    image-20220506160818549

3.2 模拟Web服务器:返回固定数据

  • 目标

    • 实现简单的Web服务器并返回固定数据给浏览器;
      image-20220507212623591
  • 整体功能:

    • 1、Web服务器能够绑定固定端口;

      2、Web服务器能够接收浏览器请求;

      3、Web服务器遵守HTTP协议,并返回“Hello World"字符串给浏览器;

      4、当浏览器关闭后,Web服务器能够显示断开连接;

      5、Web服务器短时间内重启,不会提示address already in use错误;

  • 实现步骤

    • 1、导入socket模块;

      2、创建tcp套接字;

      3、设置地址重用;

      4、绑定端口bind;

      5、设置监听listen,最大允许客户端连接数128(套接字由主动变为被动);

      6、等待客户端连接(能够接收多个客户端连接);

      7、定义函数,实现客户端信息接收和响应;

      8、接收浏览器请求,并判断请求是否为空;

      9、拼接响应报文;

      10、定义变量保存响应报文内容;

      11、发送响应报文给客户端浏览器;

      12、关闭此次连接的套接字;

  • 代码实现:
    image-20220507213403576
    image-20220507213416092

  • 小结

    • 1、导入模块;
    • 2、创建套接字;
    • 3、设置地址重用
    tcp_server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True)
    
    • 4、绑定端口和IP;
    • 5、设置套接字为被动状态,listen;
    • 6、开始接收客户端连接;
    while True:
    	new_client_socket,ip_port=tcp_server_socket.accept()
        request_handler(new_client_socket,ip_port)
    
    • 7、接收客户端发送的请求协议;
    • 8、判断客户端是否已经下线;
    • 9、拼接响应报文(响应行+响应头+响应空行+响应主体);
    • 10、发送响应报文;
    • 10、关闭和当前客户端连接;

3.3 模拟Web服务器:返回固定页面

  • 目标
    • 实现返回一个固定的html页面给浏览器的Web服务器;
      image-20220508142750127
  • 功能分析

1、Web服务器能够绑定固定端口;

2、Web服务器能够接收浏览器请求;

3、Web服务器遵守HTTP协议,并返回网页index.html的内容给浏览器;

4、当浏览器关闭后,Web服务器能够显示断开连接;

5、Web服务器短时间内重启,不会提示address already in use错误;

  • 实现步骤

1、导入socket模块;

2、创建套接字;

3、设置地址重用;

4、绑定端口IP(服务器必须要做的);

5、设置监听模式,最大允许客户端连接数128,套接字有主动变为被动;

6、等待客户端连接(能够接收多个客户端连接)

7、定义函数,实现客户端信息接收和响应;

8、接收浏览器请求,并判断请求是否为空;

9、拼接响应报文;

10、定义变量保存响应报文内容;

11、打开Index.html文件,并且读取其内容返回给客户端;

12、发送响应报文给客户端浏览器(注意转码问题);

13、关闭此次连接的套接字;

  • 代码实现
    image-20220508143341584
    image-20220508143349256

3.4 模拟Web服务器:返回指定页面

  • 目标
    • 实现根据浏览器不同请求,返回对应网页资源的Web服务器
      *image-20220508151429446
      image-20220508151638783
      image-20220508150236533
  • 功能分析

1、Web服务器能够绑定固定端口;

2、Web服务器端能够接收浏览器请求;

3、Web服务器遵守HTTP协议,根据请求返回指定的html内容给浏览器;

4、当浏览器关闭后,Web服务器能够显示断开连接;

5、Web服务器短时间内重启,不会提示address already in use错误;

  • 实现思路

1、导入socket模块;

2、创建tcp套接字;

3、设置地址重用;

4、绑定端口ip地址;

5、设置监听,最大允许客户端连接数128(套接字主动变被动);

6、等待客户端连接(能够接收多个客户端连接);

7、定义函数,实现客户端信息接收和响应;

8、接收浏览器请求,并判断请求是否为空;

9、拼接响应报文;

10、定义变量保存响应报文内容;

11、获取浏览器发送的请求头信息,分析得到请求html文件路径;

12、根据路径信息,打开指定html文件,并返回内容给客户端浏览器;

13、发送响应报文给客户端浏览器,注意转码问题;

14、关闭此次连接的套接字;

  • 代码实现
    image-20220508150810457
    image-20220508150856145
    image-20220508150909112
  • 默认首页判断
    image-20220508150938654

3.5 模拟Web服务器:返回指定页面存在的问题

  • 目标
    • 解决资源访问过程中存在的问题
  • 1、如果访问的页面不存在怎么办?
    image-20220508154312303
  • 2、默认首页判断
    image-20220508154340663
  • 小结
    image-20220508155104661

3.6 面向对象封装

  • 目标

    • 使用面向对象思想,对Web服务器进行封装
  • 功能分析

1、使用面向对象思想进行封装;

2、通过对象方法.start()启动web服务器;
image-20220508155454144

  • 实现思路

1、创建HttpServer类;

2、创建HttpServer类的构造方法,并在构造方法中对tcp_server_socket创建初始化;

3、创建start()方法,用来web服务器启动;

  • 代码实现
    image-20220508155645050
    image-20220508155707865
    image-20220508155718279

3.7 服务端基础架构构建-1

  • 目标

    • 优化代码,分模块开发
  • 1、整体功能

1、创建框架构建相关的文件夹;

2、创建app模块文件;

3、在app模块文件中创建application函数(用于处理请求);

4、将request_handler()中的处理逻辑交由app模块的application函数完成;

5、app模块的application函数返回响应报文;

  • 逻辑关系
    image-20220508161436153
  • 文件目录
  • 2、代码实现
    image-20220508161522903
    image-20220508161546777
    image-20220508161609432
    image-20220508161618120

image-20220508161628368

  • 小结
    image-20220509161417173

3.8 服务端基础框架构建-2

  • 目标
    • 优化代码,分模块开发
  • 1、整体功能

1、创建框架构建相关的文件夹;

2、创建app模块文件;

3、在app模块文件中创建application函数(用于处理请求);

4、将request_handler()中的处理逻辑交由app模块的application函数完成;

5、app模块的application函数响应数据;

6、创建utils模块,并且在该模块中创建create_http_response()函数,专门用来拼接响应报文;

7、在app模块的application函数中调用utils模块中的create_http_response()函数,得到完整的响应报文;

  • 小结
    image-20220509163243527

3.9 使用终端中启动Web服务器

  • 目标

    • 能够通过终端指定端口并启动Web服务器
    • 服务器没有pycharm,终端启动很重要!!!
  • 1、功能分析
    image-20220509163538771

  • 2、实现思路

1、导入sys模块;

2、通过sys.argv获取参数列表;

3、判断列表长度是否为2,如果不等于2要给出提示,Web服务器启动失败;

4、取出第二个参数,判断是否是一个数字,如果不是一个数组,给出提示,Web服务器启动失败;

5、接收启动参数端口号;

6、修改类构造方法,使用提供的端口号启动Web服务器;

  • 3、准备工作
    image-20220509163750112

image-20220509163822648

  • 小结
    image-20220509170246587

3.10 案例:网游服务器

  • 目标
    • 利用Web服务器选择发布Web项目
  • 1、功能分析

1、使用浏览器打开指定地址;

2、游戏运行方启动服务器,选择要发布的游戏

3、客户端刷新浏览器即可畅玩新的游戏;

  • 2、实现思路

1、定义初始化项目的方法;

2、定义字典保存项目路径 字典格式:key=项目名称 value=路径

3、循环获取字典中的所有Key;

4、根据Key获取游戏的主目录;

5、设置实例属性,保存主目录;

6、修改Web服务器的目录为实例属性保存的主目录;

  • 3、核心代码
    image-20220509192654542

  • enumerate会将列表变成一个带索引的元组数组

  • 4、代码实现
    image-20220509173517386
    image-20220509173531247
    image-20220509173538557

  • 小结
    image-20220509195923903

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【黑马-python进阶】---学习笔记(6)---系统性能监控+基于TCP的Web服务器 的相关文章

随机推荐

  • 5-软件实现

    程序设计语言 数据成分 运算成分 控制成分 传输成分 结构化程序设计编码 结构化程序设计的特点 自顶向下 逐步求情 单入口和单出口的控制结构 结构化程序设计步骤 提出和分析问题 确定数学模型 设计算法 模块化编程 编译 运行程序 模块设计和
  • DID基础介绍

    1 介绍 DID Decentralized Identity 去中心化身份标识 它的本质是基于去中心化体系下的中心化信任模型 2 相关名词解释 DID标识符 did example 1232423143215jlgaglgak 前缀必然是
  • fastDFS文件服务器的java客户端初始化方法ClientGlobal.init(fdfs_client.properties) 找不到配置文件路径异常的解决

    最近在使用fastDFS文件服务器的java客户端上传文件时 它的初始化方法ClientGlobal init String 出现找不到配置文件的异常 无论是写死fdfs client properties文件位置还是怎样 都找不到配置文件
  • 阅读element-ui源码之ResizeObserver使用

    1 ResizeObserver 阅读tabs标签页源码时 发现了这个api 于是 我查了下MDN 可以监听任意DOM元素内容区域的变化 这里的变化包括但不限于 1 某个节点的出现和隐藏 2 某个节点的大小变化 和resize api相比的
  • Mac上的oracle使用

    进入docker容器 sudo docker exec it docker ps grep oracle cut d f 1 bin bash 通过sqlplus进入Oracle sqlplus 输入用户名和密码进入 Oracle用户中的默
  • npm报错Failed at the electron-chromedriver@1.8.0 install script.

    问题描述 Electron vue 项目 npm install 报错Failed at the electron chromedriver 1 8 0 install script 解决方案 方法一 vue cli 脚手架的一个 bug
  • unity 删除依赖

    记录 Scene中有依赖废弃的资源 using System using System Collections using System Collections Generic using System IO using System Li
  • JavaScript初学 3.改变文本内容

    JavaScript改变html网页的文本内容 p JavaScript能改变html文本内容 p
  • 90个JavaScript资料免费下载【合集】

    为了方便大家学习 小弟最近整理了一批免积分下载的JavaScript 共90个 整理了这批资料的下载地址 大家可以根据自己的需要选择性下载 希望大家喜欢 JS刷新页面 源码 http down 51cto com data 452926 6
  • 【100%通过率 】【华为OD机试c++/python】回文字符串【2023 Q1考试题 A卷

    华为OD机试 题目列表 2023Q1 点这里 2023华为OD机试 刷题指南 点这里 题目描述 如果一个字符串正读和反渎都一样 大小写敏感 则称它为一个 回文串 例如 leVel是一个 回文串 因为它的正读和反读都是leVel 同理a也是
  • Visual Studio编译问题

    最近在用vs 跑下精简后的数学库 验证输出结果的 结果在其他ide上编译通过 在vs上不行 出现了一堆莫名其妙的错误 问题现象 if endif 不匹配 实际是匹配的 xxx变量未声明 实际是声明并定义的 等等诸如此类问题 解决处理 参考这
  • [1064]大数据概述

    文章目录 大数据时代的数据特点 大数据时代的关键技术 大数据时代的数据特点 一般认为 大数据主要具有 四方面的典型特征 规模性 Volume 多样性 Variety 高速性 Velocity 和价值性 Value 即所谓的 4V 1 规模性
  • Linux(Ubuntu、CentOS)命令行编辑文件后如何保存退出

    在 Ubuntu CentOS 命令行中编辑文件后 可以使用以下步骤保存并退出 按下键盘上的 Ctrl 键和 X 键组合 以退出编辑模式 如果文件已更改 你将看到提示 询问是否保存更改 按下 Y 键来确认保存更改 或按下 N 键取消保存 如
  • 遥感+python 1.3 大气校正

    遥感 python 1 3 大气校正 目录 遥感 python 1 3 大气校正 一 大气校正概念 1 吸收和散射改变大气中的电磁辐射 2 电磁能在大气中相互作用 二 大气校正的方法 1 基于辐射传输方程的大气校正 2 基于地面场数据或辅助
  • 生活之感悟

    有一些路 走下去 很累 可是 不走 会后悔 如果你的生活 处于低谷 那就大胆的向前走吧 因为不管你怎么走 你都是向上 即使没有人关注 也要努力成长 许多眼睛 都藏在你看不见的地方 压力不是有人比你努力 而是比你牛几倍的人 依然在努力 不是所
  • DNF单机版:注册失败的解决

    文章目录 注册的解决 DNF单击版本资源 linux下mysql配置文件my cnf最详细解释与目录 MyISAM 相关选项 INNODB 相关选项 安装启动 相关目录 全文约 9945 字 预计阅读时长 28分钟 注册的解决 个人遇到的问
  • 您的计算机已被.locked勒索病毒感染?恢复您的数据的方法在这里!

    导言 在数字化时代 威胁网络安全的恶意软件层出不穷 locked 勒索病毒作为其中的一员 给个人 企业和组织带来了严重的威胁 影响和心理压力 本文91数据恢复将深入分析 locked 勒索病毒的威胁性质 潜在影响以及由此产生的心理压力 一些
  • android 富文本编辑器_在vue中使用富文本编辑器vue-quill-editor

    一 前言 在一些博客 评论相关的位置 我们不会简单使用 HTML 中的 input 或者 textarea 等纯文本 需要用到富文本编辑器 即实现可以对文本进行加粗 变色 改变字体及大小等操作 本文借助的是vue quill editor
  • Linux怎么修改用户密码

    地址 linux修改用户密码 方法 步骤 首先 要用mobaxterm软件连接Linux系统 1 Linux怎么修改用户密码 首选 确认是用root用户登录系统的 输入命令 id 查看登录用户信息 2 Linux怎么修改用户密码 若修改ro
  • 【黑马-python进阶】---学习笔记(6)---系统性能监控+基于TCP的Web服务器

    1 系统性能定时监控 1 1 系统监控概述 用Python来编写脚本简化日常的运维工作是Python的一个重要用途 在Linux下 有许多系统命令可以时刻监控系统运行的状态 1 2 psutil psutil是python system a