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):
pass def handle(self):
pass def 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()函数将请求处理分发给了其他的具体处理.

python 内置标准库socketserver模块的思考的更多相关文章

  1. Python内置标准模块

    time 模块 1 >>> import time 2 >>> time.time() 3 1491064723.808669 4 >>> # t ...

  2. python学习笔记(七)- 递归、python内置函数、random模块

    1.函数的不固定参数: #参数不是必填的.没有限制参数的个数.返回参数组的元组 def syz(*args): #参数组,不限制参数个数 #‘args’参数的名字可以随便命名 print(args) ...

  3. [python标准库]Pickle模块

    Pickle-------python对象序列化 本文主要阐述以下几点: 1.pickle模块简介 2.pickle模块提供的方法 3.注意事项 4.实例解析 1.pickle模块简介 The pic ...

  4. Python内置的urllib模块不支持https协议的解决办法

    Django站点使用django_cas接入SSO(单点登录系统),配置完成后登录,抛出“urlopen error unknown url type: https”异常.寻根朔源发现是python内 ...

  5. python协程函数、递归、匿名函数与内置函数使用、模块与包

    目录: 协程函数(yield生成器用法二) 面向过程编程 递归 匿名函数与内置函数的使用 模块 包 常用标准模块之re(正则表达式) 一.协程函数(yield生成器用法二) 1.生成器的语句形式 a. ...

  6. Python内置的操作系统模块(os)与解释器交互模块(sys)

    Python内置的操作系统模块(os)与解释器交互模块(sys) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本片博客只介绍Python调用操作系统的模块即os模块,以及Pyth ...

  7. Python 标准库 ConfigParser 模块 的使用

    Python 标准库 ConfigParser 模块 的使用 demo #!/usr/bin/env python # coding=utf-8 import ConfigParser import ...

  8. Python标准库——collections模块的Counter类

    1.collections模块 collections模块自Python 2.4版本开始被引入,包含了dict.set.list.tuple以外的一些特殊的容器类型,分别是: OrderedDict类 ...

  9. Python内置OS模块用法详解

    大家好,从今天起早起Python将持续更新由小甜同学从初学者的角度学习Python的笔记,其特点就是全文大多由新手易理解的代码与注释及动态演示.刚入门的读者千万不要错过! 很多人学习python,不知 ...

随机推荐

  1. 1026. Table Tennis (30)

    题目如下: A table tennis club has N tables available to the public. The tables are numbered from 1 to N. ...

  2. 【Android应用开发】Android Studio 简介 (Android Studio Overview)

    一. Intelij IDEA 环境简介 Android Studio 来源 : Android Studio 是 Intelij IDEA 的免费版本 + Android SDK 集成的; -- I ...

  3. (一〇九)UIButton的使用技巧 -imageView、titleLabel、圆角等

    UIButton是一个常用控件,使用方法十分基本,但是有很多技巧常常不被注意,本文主要介绍UIButton的一些较高级技巧,用于实现图片和标签显示的美观性等. 开发时常常碰到按钮的下侧或者右侧有标题的 ...

  4. Dynamics CRM2015 2015版本可用的OData Query Designer工具

    2015后很多工具无法使用,包括2011版的OData Query Designer,这里介绍一款可用的工具,Dynamics XRM Tools for CRM 2015,下载地址:https:// ...

  5. Android开发学习之路--Service之初体验

    android最后一个组件便是service了,终于学习到最后一个组件了,从年前的开发环境的搭建,到现在学到最后一个组件花了三周的时间,期间记录的点点滴滴,照着书本学习编写的代码都受益匪浅,这里要感谢 ...

  6. Android面试题目总结

    1.java 基础题,输入结果是什么? public static void main(String[] args) { String str = new String("abc" ...

  7. awk:快速入门(简单实用19例+鸟哥书内容)

    awk 用法:awk ' pattern {action} '  变量名 含义  ARGC 命令行变元个数  ARGV 命令行变元数组  FILENAME 当前输入文件名  FNR 当前文件中的记录号 ...

  8. A*寻路算法入门(七)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...

  9. Java-IO之FilterInputStream和FilterOuptStream

    FilterInputStream的作用是用来封装其他的输入流,并为它们提供了额外的功能,它的常用的子类有BufferedInputStream和DataInputStream.FilterOutpu ...

  10. Chapter 1 Securing Your Server and Network(14):限制功能——xp_cmdshell 和OPENROWSET

    原文出处:http://blog.csdn.net/dba_huangzj/article/details/38656615,专题目录:http://blog.csdn.net/dba_huangzj ...