zoukankan      html  css  js  c++  java
  • 第二十四篇、socketserver源码剖析

    这里选择的是python2.7(python3和2.7的源码基本类似)

    #
    !/usr/bin/env python # -*- coding:utf-8 -*- import SocketServer class MyServer(SocketServer.BaseRequestHandler): def handle(self): conn = self.request conn.sendall(bytes("欢迎来啊", encoding="utf-8")) while True: ret_bytes = conn.recv(1024) ret_str = str(ret_bytes, encoding="utf-8") if ret_str == "q": break conn.sendall(bytes(ret_str + "", encoding="utf-8")) if __name__ == "__main__": server = SocketServer.ThreadingTCPServer(("127.0.0.1",999),MyServer) server.serve_forever()

    分析如下:

    先执行main方法,(socketserver就是socket+select+多线程组成)

    执行main方法,由于执行类(类里面有参数),就是执行这个类的构造方法

    由于是多继承,所以,先去左边threadingMixIn类里面寻找构造方法__init__,如下图,里面没有构造方法,但是有process_request方法

     

    然后去执行右边TCPServer基类中寻找构造方法

     

    这里面有构造发方法,这个构造方法里面有参数。

    server_address 参数就是端口和ip

    由于这里传入了两个参数,所以这里RequestHandlerClass就是MyServer这个类

    RequestHandlerClass()就会执行MyServer类里面的方法
    obj = RequestHandlerClass()
    obj.handle()  那么就会执行MyServer().handle()方法

    之后执行

    BaseServer.__init__(self, server_address, RequestHandlerClass)

    就是执行父类的构造方法,查看BaseServer这个基类

    这个基类的构造方法,可以看出RequestHandlerClass = self.RequestHandlerClass

    然后执行

    obj = self.RequestHandlerClass()  就会执行
    obj.handle()  那么就会执行MyServer().handle()方法

    往下执行,self.socket = socket.socke,这里就是执行socket方法。

    继续往下执行,就会执行server_bind()方法里面的,socket.bind()绑定方法,之后执行server_activite()方法里面的socket.listen()方法

     

    之后就监听完毕,也就是构造方法执行完毕,构造方法执行完毕也就是

    server = SocketServer.ThreadingTCPServer(("127.0.0.1",999),MyServer)

    这句话执行完毕

    总结:

    1、先执行ThreadingTCPServer的构造方法,里面没有构造方法,然后就去父类里面执行构造方法,ThreadingTCPServer.init() = TCPServer.init()=BaseTCPServer.init()方法

    然后里面执行了如下操作

    1、  封装了端口和IP

    self.server_address   (‘127.0.0.1’,8009)

    2、  封装了方法

    self.RequestHandlerClass   MyServer

    3、  创建了socket对象

    self.socket       创建了服务端的socket对象

    之后执行server.server_forever()方法

                       在BaseTCPServer中寻找到这个方法

     

    这里就执行了select方法,里面的self指代的就是server对象,而server又创建了self.socket。

    这里参数self就是为了监听socket

    if self in r,这里就是只要客户端连接,就执行这里的方法self.handle_request_noblock()方法

     

    上面的request,client_address = self.get_request()就是执行accept()方法、阻塞

    然后往下执行self.process_request()方法

    这里的process_request方法就是ThreadingTCPServer执行process_request方法,然后就开始去ThreadingMixIn里面执行

     

    这里的process_request()方法就是多线程方法,并且同时执行self.finish_request()方法,然后开始找基类中的方法。最后在BaseTCPServer基类中有如下方法

     

    方法中执行的self.RequestHandlerClass()方法,就相当于执行MyServer方法,然后执行里面的构造方法

  • 相关阅读:
    enum
    爬虫实战2:爬头条网美图--Ajax图片加载处理
    爬虫实战1:使用requests和正则爬取电影信息
    爬虫7:selenium
    爬虫6:pyquery库
    爬虫5:beautifulsoup
    爬虫4:re库
    爬虫3:requests库
    爬虫2:urllib
    爬虫1:概述
  • 原文地址:https://www.cnblogs.com/pyrene/p/6443379.html
Copyright © 2011-2022 走看看