socketserver源码剖析

Posted pyrene

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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方法,然后执行里面的构造方法

以上是关于socketserver源码剖析的主要内容,如果未能解决你的问题,请参考以下文章

Python 学习笔记 - socketserver源代码剖析

PythonSocket编程IO多路复用SocketServer

Python----Socket编程IO多路复用SocketServer

socketserver源码解析和协程版socketserver

解读python中SocketServer源码

解读python中SocketServer源码