python3 socketserver源码解析_Python SocketServer源码分析

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本身。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值