这里选择的是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源码剖析的更多相关文章

  1. 自己实现多线程的socket,socketserver源码剖析

    1,IO多路复用 三种多路复用的机制:select.poll.epoll 用的多的两个:select和epoll 简单的说就是:1,select和poll所有平台都支持,epoll只有linux支持2 ...

  2. socketserver 源码剖析:

    socketserver 源码剖析[有图有真相]: (一).Socketserver 内部流程调用图:        详解:  1.self.RequestHandlerClass() = MyCla ...

  3. SpringBoot第二十四篇:应用监控之Admin

    作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/11457867.html 版权声明:本文为博主原创文章,转载请附上博文链接! 引言   前一章(S ...

  4. socketserver源码剖析

    作者:人世间链接:https://www.jianshu.com/p/357e436936bf來源:简书简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处 BaseServer 和 B ...

  5. 第十四章 Executors源码解析

    前边两章介绍了基础线程池ThreadPoolExecutor的使用方式.工作机理.参数详细介绍以及核心源码解析. 具体的介绍请参照: 第十二章 ThreadPoolExecutor使用与工作机理 第十 ...

  6. (转) SpringBoot非官方教程 | 第二十四篇: springboot整合docker

    这篇文篇介绍,怎么为 springboot程序构建一个Docker镜像.docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源.Docker 可以让开发者打包他们的 ...

  7. SpringBoot非官方教程 | 第二十四篇: springboot整合docker

    转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springboot/2017/07/11/springboot24-docker/ 本文出自方志朋的博客 这篇文 ...

  8. 第二十四篇 jQuery 学习6 删除元素

    jQuery 学习6 删除元素   上节课我们做了添加元素,模拟的是楼主发的文章,路人评论,那么同学们这节课学了删除之后,去之前的代码上添加一个删除,模拟一个楼主删除路人的评论. jQuery的删除方 ...

  9. 第二十四篇-用VideoView制作一个简单的视频播放器

    使用VideoView播放视频,视频路径有三种: 1. SD卡中 2. Android的资源文件中 3. 网络视频 第一种,SD卡中的方法. 路径写绝对路径,如果不能播放,可以赋予读取权限. 效果图: ...

随机推荐

  1. 点击tablecell中的一个按钮,确定cell所在的行

    - (void) del:(UIButton *) button { NSLog(@"%s",__FUNCTION__); UITableViewCell * cell = (UI ...

  2. Ubuntu16.04 打开txt文件乱码

    最近遇到个小问题:Ubuntu16.04下打开txt出现乱码,倒腾下解决了这个问题,记录下来. Ubuntu16.04 默认已经安装gedit.直接双击被打开的文件默认用gedit打开,显然这种方式行 ...

  3. 高效抽取loading,再多的载入页面也不怕

    当今的app基本上有两个操作,一个是载入数据 ,一个就是把数据显示到页面上.但假设页面特别的多.就每一个页面都要载入数据,就要写 loading 页面.我之前就是用dialog写,抽取出来一个类.哪里 ...

  4. Git--Bug解决篇

    Git--公司bug解决篇 作为程序员,我们时常遇到这样的场景,公司的产品上线了,程序员们美滋滋的开始开发新功能希望得到更多的流量.这时候,公司上线的产品发生了很严重的bug,可是我们已经在这个bug ...

  5. 大师养成计划之二:hibernate框架的使用------实例演示

    搭建hibernate项目框架的步骤: 一.导入jar包 二.new    .cfg.xml配置文件 <?xml version="1.0" encoding="U ...

  6. (1) yum源配置-epel

    1.获取epel地址 登录https://fedoraproject.org/wiki/EPEL/zh-cn,看“如何获取EPEL的软件包”,根据你的操作系统版本,复制对应的下载地址. 2.下载epe ...

  7. CentOS 源码安装svn

    一. 下载依赖包 1. apr源码包 http://mirrors.tuna.tsinghua.edu.cn/apache//apr/apr-1.5.2.tar.gz 2. apr-util源码包 h ...

  8. 07 在Windows下编译Memcached

    一:windows下编译Memcached (1)下载地址dll:http://down.51cto.com/data/442606 (2)在php下输出 echo phpinfo():查看php的版 ...

  9. systemctl使用说明

    # systemctl #输出已激活单元 # systemctl list-units #输出已激活单元 # systemctl --failed #输出运行失败的单元 # systemctl lis ...

  10. Oracle Data Provider for .NET的使用(托管与非托管(一))

    目录 简单的概述 简单的使用 非托管系统要求 托管驱动系统要求 其它的注意事项 ODP.NET版本说明 安装ODP.NET 安装非托管驱动 非托管驱动绿色配置 简单的概述 ODP.NET的含义是 Or ...