第二十四篇、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源码剖析的更多相关文章
- 自己实现多线程的socket,socketserver源码剖析
1,IO多路复用 三种多路复用的机制:select.poll.epoll 用的多的两个:select和epoll 简单的说就是:1,select和poll所有平台都支持,epoll只有linux支持2 ...
- socketserver 源码剖析:
socketserver 源码剖析[有图有真相]: (一).Socketserver 内部流程调用图: 详解: 1.self.RequestHandlerClass() = MyCla ...
- SpringBoot第二十四篇:应用监控之Admin
作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/11457867.html 版权声明:本文为博主原创文章,转载请附上博文链接! 引言 前一章(S ...
- socketserver源码剖析
作者:人世间链接:https://www.jianshu.com/p/357e436936bf來源:简书简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处 BaseServer 和 B ...
- 第十四章 Executors源码解析
前边两章介绍了基础线程池ThreadPoolExecutor的使用方式.工作机理.参数详细介绍以及核心源码解析. 具体的介绍请参照: 第十二章 ThreadPoolExecutor使用与工作机理 第十 ...
- (转) SpringBoot非官方教程 | 第二十四篇: springboot整合docker
这篇文篇介绍,怎么为 springboot程序构建一个Docker镜像.docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源.Docker 可以让开发者打包他们的 ...
- SpringBoot非官方教程 | 第二十四篇: springboot整合docker
转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springboot/2017/07/11/springboot24-docker/ 本文出自方志朋的博客 这篇文 ...
- 第二十四篇 jQuery 学习6 删除元素
jQuery 学习6 删除元素 上节课我们做了添加元素,模拟的是楼主发的文章,路人评论,那么同学们这节课学了删除之后,去之前的代码上添加一个删除,模拟一个楼主删除路人的评论. jQuery的删除方 ...
- 第二十四篇-用VideoView制作一个简单的视频播放器
使用VideoView播放视频,视频路径有三种: 1. SD卡中 2. Android的资源文件中 3. 网络视频 第一种,SD卡中的方法. 路径写绝对路径,如果不能播放,可以赋予读取权限. 效果图: ...
随机推荐
- js获取url传递参数值
function request(paras) { var url = location.href; var paraString = url.substr ...
- Android提供支持不同屏幕大小的各种方法
1 http://blog.csdn.net/guolin_blog/article/details/8830286 (手机平板,通过large-layout来区分两条布局文件) 2 http:// ...
- Android内容提供者
一个应用中的数据库对别人是不会提供直接的访问的,而是提供接口给别人访问,但是一般应用开发的时候都是去获取别人的数据,而不是自己提供数据. 继承ContentProvider: 在Menifest中注册 ...
- 快速清除MS SQL SERVER 日志
USE [master] GO ALTER DATABASE yourdatabase SET RECOVERY SIMPLE WITH NO_WAIT GO ALTER DATABASE yourd ...
- zookeeper应用场景之配置文件同步
p=2628">http://www.firefoxbug.net/?p=2628
- 一站式WPF--依赖属性(DependencyProperty)
2009-10-20 11:32 by 周永恒, 22441 阅读, 24 评论, 收藏, 编辑 书接上文,前篇文章介绍了依赖属性的原理和实现了一个简单的DependencyProperty(DP), ...
- react-native create-react-app创建项目报错SyntaxError: Unexpected end of JSON input while parsing near '...ttachment":false,"tar' npm代理
SyntaxError: Unexpected end of JSON input while parsing near '...ttachment":false,"tar' 错误 ...
- 微信小程序之如何注册微信小程序
所有文章均是CSDN博客所看,已按照作者要求,注明出处了,感谢作者的整理! 博客文章地址:http://blog.csdn.net/michael_ouyang/article/details/546 ...
- Solr In Action 中文版 第一章(四、五)
1.1 功能概览1. 4 最后,让我们再依照以下的分类.高速的过一下Solr的主要功能: ·用户体验 ·数据建模 ·Solr 4的新功能 在本书中.为你的用户提供良好的搜索体验 ...
- C++ 错误积累
错误一 VS2012错误:不能在成员函数 的类外部重新声明该函数 解决:检查函数的大括号匹配