python 内置标准库socketserver模块的思考

socketserver模块简化了编写网络服务器的任务, 在很大程度上封装了一些操作, 你可以看成是事件驱动型的设计, 这很不错。它定义了两个最基本的类--服务器类 BaseServer, 请求处理类 BaseRequestHandler.

BaseServer 基本服务器类封装了基本的一些socket操作, socket原语中对socket的相关操作仅仅封装到了accept 方法, 此方法之前的操作也封装完了, 接下来的send, recv原语操作就没有在进行封装了, 那么它哪去了呢?这是socketserver模块设计的很好的地方, socketserver不仅仅有对socket原语操作的, 还有对需要进行具体处理的基类封装, 那就是BaseRequestHandler 类.举两个例子, 首先是WSGI协议的处理, 具体请看<深入浅出web服务器与python应用程序之间的联系 http://www.cnblogs.com/zhiyong-ITNote/p/7522093.html>. 找到python 的安装目录里面的wsgiref 文件夹, 我们分析下simple_server.py模块, 以及handlers.py模块。
注意下 simple_server.py模块的make_server 函数, 该函数的第五个参数就是自定义的请求处理类, 我们利用这个类来处理WSGI协议, 以实现服务器与python 应用程序之间的通信. 我们看看这个类的继承顺序:
WSGIRequestHandler → BaseHTTPRequestHandler → StreamRequestHandler → BaseRequestHandler.
我们看看最终父类的实现:

class BaseRequestHandler:"""Base class for request handler classes.This class is instantiated for each request to be handled. The
constructor sets the instance variables request, client_address
and server, and then calls the handle() method. To implement a
specific service, all you need to do is to derive a class which
defines a handle() method.The handle() method can find the request as self.request, the
client address as self.client_address, and the server (in case it
needs access to per-server information) as self.server. Since a
separate instance is created for each request, the handle() method
can define other arbitrary instance variables."""def __init__(self, request, client_address, server):
self.request = request
self.client_address = client_address
self.server = server
self.setup()
try:
self.handle()
finally:
self.finish()def setup(self):
passdef handle(self):
passdef finish(self):
pass

我们注意下注释中对handle() 函数的解释, 此函数是对每个请求的实际处理. 我们回到WSGIRequestHandler的程序中, WSGIRequestHandler 类中有一个handle() 函数, 此函数就是重写并实现了基类的handle() 函数, 将请求处理分到了handlers.py这个模块中, 用来处理WSGI协议.

第二个例子就是python 自带的HTTPServer, 我们在python 3下启动自带的HTTPServer, 在命令行敲入:
python -m http.server 8000
看看浏览器的响应:

打开python安装目录下的http文件夹, 我们看看server.py这个文件, 然后我们看看test() 这个测试函数的代码, 找到其中的HandlerClass变量, 其指向的是SimpleHTTPRequestHandler类, 我们看看这个类的继承顺序:
SimpleHTTPRequestHandler → BaseHTTPRequestHandler → StreamRequestHandler → BaseRequestHandler
上面的第三个类是用来处理TCP流式通信的, 可以看到HTTPServer 的请求处理最后还是基于BaseRequestHandler类, 而且具体的还是使用handle() 函数来处理, BaseHTTPRequestHandler类中的handle() 函数分发了处理请求的任务给其他函数.

最后做下总结吧, python两个内置的实现都是基于socketserver.py模块, 主要就是调用了BaseServer类与BaseRequestHandler类, 前者封装了基本的socket处理, 后者封装了对请求的处理, 通过其内的handle()函数将请求处理分发给了其他的具体处理.


更多专业前端知识,请上 【猿2048】www.mk2048.com

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

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

相关文章

关于素数的一些定理

1.何谓素数&#xff1f; 指在一个大于1的整数中&#xff0c;如果一个数只能整除1与本身&#xff0c;则该数为素数&#xff08;质数&#xff09;&#xff0c;否则为合数。 1既不是素数也不是合数 2.素数个数无限多 3.所有大于2的素数都可以唯一的表示为两个平方数之差 pa^2-b^2(…

教师节的感触

刚喝了点酒&#xff0c;因为今天是教师节&#xff0c;我觉得博客是一个很好的平台&#xff0c;可以把自己的一些感想就是的发表出来。把音乐放出来一 边写着博客是一种很自我的感觉&#xff0c;可以在微酣的时候把自己的点滴感受好好的梳理一下倒是一种不错的方式。这是自己第一…

Spring 4.1和Java 8:java.util.Optional

由于Spring 4.1的Java 8的的java.util.Optional &#xff0c;容器对象可能会或可能不包含非空值&#xff0c;支持与RequestParam &#xff0c; RequestHeader和MatrixVariable 。 使用Java 8的java.util.Optional请确保参数永远不会为null 。 请求参数 在此示例中&#xff0c;…

计算机网络层实验路由表苏州科技,苏州科技大学计算机网络实验报告课案.docx...

苏州科技大学计算机网络实验报告课案苏州科技学院 电子信息实验中心实验报告课  程计算机网络原理学    名徐金玮班  级计算机1312专  业计算机科学与技术指导教师陶滔学年 / 学期2015~2016学年第一学期实验一 物理层实验实验项目性质&#xff1a;设计性  计划学…

Fibonacci again and again

Fibonacci again and again http://acm.hdu.edu.cn/showproblem.php?pid1848 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 12494 Accepted Submission(s): 5439 Problem Description任何一个大学生对菲波那…

使用闭包的方式实现一个累加函数 addNum

使用闭包的方式实现一个累加函数 addNum&#xff0c;参数为 number 类型&#xff0c;每次返回的结果 上一次计算的值 传入的值&#xff0c;如&#xff1a; addNum(10); //10 addNum(12); //22 addNum(30); //52 写法一 1 function sum(numberOne) {2 var count…

妈妈的菜谱-豉油鸡

我妈周末来我家&#xff0c;给我做一道豉油鸡&#xff0c;我记录下来&#xff0c;分享给大家 1、下午四点半左右&#xff0c;我、老弟以及亲妈&#xff0c;到隔壁市场鸡场&#xff0c;挑选了一只类似的芦花阉鸡活鸡&#xff0c;价格是17块钱每斤&#xff0c;大概三斤多点&#…

【Vegas2008】9月19日-青椒炒南瓜

南瓜&#xff0c;在俺们家&#xff0c;宁夏也叫葫芦。这道菜泡米饭相当好吃。 主料&#xff1a;青椒、南瓜 配料&#xff1a;葱、姜 调料&#xff1a;盐、味精、胡椒粉 做法&#xff1a;1&#xff0c;南瓜切块&#xff0c;青椒切块&#xff1b;2&#xff0c;油烧至6成熟&#x…

计算机机房t4,机房等级-T2-T3-T4-如何划分

如何在众多的IDC服务商中的辨别出服务器和机房环境的好坏呢?小编告诉大家有这么个指标是我们在选购服务器的时候可以参考&#xff0c;且具有权威性的。国际正常时间协会(the Uptime Institute&#xff0c;简称UI)依据数据中心基础设施的可用性把机房划分为四个级别&#xff1a…

在N + 1场景中使用@NamedEntityGraph更有选择地加载JPA实体

N 1问题是使用ORM解决方案时的常见问题。 当您将某些OneToMany关系的fetchType设置为lazy时&#xff0c;会发生这种情况&#xff0c;以便仅在访问Set / List时才加载子实体。 假设我们有一个具有两个关系的Customer实体&#xff1a;每个客户的一组订单和一组地址。 OneToMany…

JetBrains系列IDE快捷键大全(转载)

编辑 快捷键组合说明Ctrl Space代码自动完成提示&#xff08;选择&#xff09;Alt Enter显示意图动作和快速修复Ctrl P参数信息 &#xff08;在调用方法参数忘记的时候&#xff0c;提示&#xff09;Ctrl Q快速查找文件&#xff0c;可以查找当前类定义的文件等Ctrl 鼠标滑过…

Vs Code 配置C/C++ 开发环境

第一步&#xff1a;下载 Vs Code 点击链接下载Vs Code 下载版本 并安装 https://code.visualstudio.com/ 点击 Download for Windwos 安装时 如图&#xff1a;请一定要勾选 添加到PATH (环境变量&#xff09; 其他选项可根据个人需要选配 但建议全部勾选 第二步&#xf…

28. css样式中px转rem

Vue3:脚手架配置 https://blog.csdn.net/weixin_41424247/article/details/80867351 与原来的vue-cli 2.x版本不同的是&#xff1a;如果使用最新版本的vue/cli初始化vue项目时&#xff0c;通常看不到webpack的配制文件。而在原来的2.x版本&#xff0c;我们可以在utils.js中轻…

集合已修改;可能无法执行枚举操作。

在对某个List进行遍历的同时&#xff0c;需要对其中的Item进行删除操作。 会提示错误&#xff1a;集合已修改&#xff1b;可能无法执行枚举操作 Codeforeach (VirtualTDate vtDate in tempList){ if (vtDate.Date itemTime.Date) { tempList.Remove(vtDate); …

UI测试脸型软件,App脸型美化剖析|UI-影视-其他|观点|freshoil - 原创文章 - 站酷 (ZCOOL)...

本文基于市面上多款App的美颜效果&#xff0c;做了一个对比分析&#xff0c;整理出一个可以指导美颜调教的参考规范。研究的几个要点如下&#xff1a;1.通过对 某陌、某音、某Y、某他相机、某天P图的效果对比分析2.本次只针对默认效果做对比(某Y无默认则选择自然)3.统一使用前置…

使用Docker,Chef和Amazon OpsWorks进行集群范围的Java / Scala应用程序部署

Docker非常适合在单个节点上运行隔离的容器。 但是&#xff0c;大多数软件系统都在多个节点上运行&#xff0c;因此&#xff0c;除了Docker之外&#xff0c;我们还需要某种方法来指定哪些容器应在哪些节点上运行。 我要解决的特定问题如下&#xff1a;我有两个Scala守护程序&a…

根据输入成绩显示成绩等级(新手)

//导入包。 import java.util.Scanner; //定义一个类。 public class zy238{    //公共静态的主方法。 public static void main(String[] args){ //打印提示。     System.out.println("请你输入成绩"); //为其创建变量。     Scanner sc new Scanner(Sy…

Tmux: 打造精致与实用并存的终端

由于最近需要经常 ssh 到远程环境&#xff0c;遂趁此折腾了一番 tmux。毕竟 工欲善其事&#xff0c;必先利其器 以下是我的配置文件地址&#xff0c;并在不断摸索与更新中。特别喜欢 solarized 主题&#xff0c;于是参考它配了状态栏的主题。在后边我会列出一些平时使用的技巧&…

8、路由 router

路由:router 用户功能 /user ----> index.html /user/login ----> login.html /user/reg ----> reg.html /user userRouter > express.Router(); app.use("/user",userRouter); 新闻功能 /news ----> index.html /news/edit ----> edit.ht…

服务器装虚拟化平台,vmware服务器虚拟化方案(vmware虚拟化平台部署)

服务器虚拟化平台方案主要的有三种&#xff0c;特点分别如下&#xff1a;1、思杰Citrix XenServer :XenCenter是Citrix的虚拟化图形接口管理工具&#xff0c;可在同一界面&#xff0c;管理多台的XenServer服务。以前见过一台服务器安装虚拟服务器&#xff0c;然后可以装N个系统…