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

  • 相关阅读:
    用户 'IIS APPPOOLPrivate' 登录失败。
    WCF 内置跟踪日志
    Ionic3 下拉刷新
    Ionic3 组件懒加载
    Ionic3 编程-应用启动进入引导页
    mysql数据库导入导出
    PHP-生成二维码(qr-code)
    javascript 总结(常用工具类的封装)
    Ajax跨域原理及解决方案
    封装获取连续数字的拼接
  • 原文地址:https://www.cnblogs.com/tuzkee/p/3573210.html
Copyright © 2020-2023  润新知