1      XXXServer

1.1      BaseSever

提供基础的循环等待请求的处理框架。使用serve_forever启动服务,使用shutdown停止。同时提供了一些可自行扩展的方法,用于对不同类型的请求做自己想要的处理。

1.2      TCPServer

在BaseServer基础上增加了一个TCP的socket连接,使用server_bind、server_activate、server_close处理TCP启停等操作

同时增加了get_request、shutdown_request、close_request处理客户端请求。

1.3      UDPServer

继承自TCPServer,将socket改为了SOCK_DGRAM型,并修改了get_request,用于从SOCK_DGRAM中获取request。

同时server_activate、shutdown_request、close_request都改成了空(UDP不需要),比TCP简单一些。

2      XXXMixIn

2.1      ForkingMixIn

提供了process_request方法,每一个请求开启一个新进程来处理

2.2      ThreadingMixIn

提供了process_request方法,每一个请求开启一个新线程来处理

说明:

XXXMixIn专门提供process_request,用来覆盖XXXServer的默认的process_request。(掺合模式:Mixin,可以看做一个设计模式,有点AOP的味道)

使用方法是,同时继承XXXMinIn和XXXServer,例如标准库的:

class ThreadingTCPServer(ThreadingMixIn, TCPServer): pass

一个细节:XXXMixIn一点要写在左侧,XXXServer要写在右侧,这样XXXMinIn里面的process_request方法才会覆盖XXXServer的process_request方法。这个是由python的MRO决定的。

3      XXXRequestHandler

XXXServer在处理request时会调用RequestHandlerClass

self.RequestHandlerClass(request, client_address, self)

因此可以定义各种RequestHandlerClass,来实现对请求的处理。(组合。另一个设计模式?)

3.1      BaseRequestHandler

定义RequestHandlerClass的基本框架,包括三个成员变量:request、client_address、server;然后会依次调用setup()、handle()、finish(),子类可通过覆盖这几个函数实现不同功能。

3.2      StreamRequestHandler

最主要的功能是根据socket生成了读写socket用的两个文件对象(可以理解为句柄)rfile和wfile

3.3      DatagramRequestHandler

同样是生成rfile和wfile,但UDP不直接关联socket。这里的rfile是直接由从UDP中读取的数据生成的,wfile则是新建了一个StringIO,用于写数据。

说明:

在StreamRequestHandler和DatagramRequestHandler中request的含义不同。

StreamRequestHandler中,request是一个TCP连接。每个TCP server在accept一个客户端请求后,都会产生一个新的TCP连接,request就是这个新连接。

DatagramRequestHandler中,request是(data, self.socket),前者是从socket中接收到的数据,后者是socket本身。

Python SocketServer源码分析的更多相关文章

  1. python SocketServer 源码分析

    附上原文链接: http://beginman.cn/python/2015/04/06/python-SocketServer/

  2. python基础-11 socket,IO多路复用,select伪造多线程,select读写分离。socketserver源码分析

    Socket socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. sock ...

  3. Python之socketserver源码分析

    一.socketserver简介 socketserver是一个创建服务器的框架,封装了许多功能用来处理来自客户端的请求,简化了自己写服务端代码.比如说对于基本的套接字服务器(socket-based ...

  4. eos源码分析和应用(一)调试环境搭建

    转载自 http://www.limerence2017.com/2018/09/02/eos1/#more eos基于区块链技术实现的开源引擎,开发人员可以基于该引擎开发DAPP(分布式应用).下面 ...

  5. python multiprocessing 源码分析

    1. 文档是最先需要了解的,读完文档可能会有很多的意外的收获同时也会留下疑惑,对于一般的使用我觉得读完文档就差不多了,除非一些很有疑惑的地方你可能需要再深入的了解一下.我读文档的目的第一个就是为了找出 ...

  6. python成长之路10——socketserver源码分析

    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM,0) 参数一:地址簇 socket.AF_INET ipv4(默认) socket.AF_INE ...

  7. python slots源码分析

    上次总结Python3的字典实现后的某一天,突然开窍Python的__slots__的实现应该也是类似,于是翻了翻CPython的源码,果然如此! 关于在自定义类里面添加__slots__的效果,网上 ...

  8. selenium3 + python - action_chains源码分析

    ActionChains简介 actionchains是selenium里面专门处理鼠标相关的操作如:鼠标移动,鼠标按钮操作,按键和上下文菜单(鼠标右键)交互.这对于做更复杂的动作非常有用,比如悬停和 ...

  9. python ironicclient源码分析

    ironicclient是一个cli工具,用来和用户交互的. 首先写一个简单的例子,获取ironic所有的node节点: from ironicclient import client if __na ...

随机推荐

  1. (原创)关于SQL Server 2005 的自动远程数据库备份

    由于项目需要,需要对目标服务器上的数据库每天进行备份并转移,查阅网上的一些帮助,结合自己的实际需要,写了这篇文章,希望对有同样需求的朋友有所帮助.目标服务器:192.168.1.197,备份服务器:1 ...

  2. 再次熟悉jdbc连接mysql

    闲来无事想探究一下jdbc 1.首先准备工作.我们要下载jdbc驱动包mysql-connector-java-5.1.7-bin.jar.其他的暂时先不用,这个包的下载地址:http://pan.b ...

  3. JS中iframe相关的window.self,window.parent,window.top

    window.self指的是当前窗口:他等价于window,self,window.self window.top指的是最顶层的窗口(有些页面可能会嵌套好几个iframe)如果只有一个窗口,那么就返回 ...

  4. c++链表归并排序的迭代版本

    之前用js写了个归并排序非递归版,而这一次,c++封装链表的时候也遇到了一个归并排序的接口.邓老师实现了递归版本的归并排序,但是递归的调用函数栈的累积是很占内存空间的.于是乎,那试试在链表结构上实现以 ...

  5. [poj2777] Count Color (线段树 + 位运算) (水题)

    发现自己越来越傻逼了.一道傻逼题搞了一晚上一直超时,凭啥子就我不能过??? 然后发现cin没关stdio同步... Description Chosen Problem Solving and Pro ...

  6. centos7 firewall 防火墙 命令

    为了架设ss在vultr上买了一个日本的vps 用的是centos7的系统 防火墙是 firewall 捣鼓了两天 在这里总结一下. 如果小伙伴也准备在vultr上买vps  在注册是 可以使用这个优 ...

  7. linux 修改home目录下的中文目录名为英文

    编辑home/下的 .config/user-dirs.dirs,把所有的中文名称修改为英文名称 在home目录下创建对应的英文名称路径 运行 xdg-user-dirs-update 重启机器

  8. ★Java多线程编程总结 系列 转

    下面是Java线程系列博文的一个编目:   Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Jav ...

  9. JS中的各种类型转换规则(转)

    JS中的类型转换非常恶心,大家都懂的,不过该学还是要学. 今天看犀牛书看到了转换规则,总结出来. X转字符串.数字.布尔值 X表示各种类型的值,直接上图: 值 转数字 转字符串 转布尔值 undefi ...

  10. Navicat for mysql 破解

    想用navicat for mysql 连接mysql,发现只能试用30天,感觉挺不爽的,购买的话发现价格一千多,好贵的软件. 所以想要破解一下,网上试了一些方法不行,最后找到了一种方法可以的 破解工 ...