python成长之路10——socketserver源码分析
1 s = socket.socket(socket.AF_INET,socket.SOCK_STREAM,0) 2 3 参数一:地址簇 4 socket.AF_INET ipv4(默认) 5 socket.AF_INET6 ipv6 6 7 socket.AF_UNIX 本地进程间通信 8 9 参数二:类型 10 socket.SOCK_STREAM 流式socket,TCP(默认) 11 socket.SOCK_DGRAM 数据报式socket,UDP 12 socket.SOCK_RAW 原始套接字,ICMP,IGMP 13 socket.SOCK_RDM 可靠的UDP形式 14 socket.SOCK_SEQPACKET 可靠的连续数据包服务 15 16 参数三:协议 17 0 (默认) 与特定地址家族相关的协议,如果是0,则系统会根据地址格式和套接类别,自动选择一个合适的协议 18 19 s.bind(ip_port) 20 s.listen(backlog) backlog:最大挂起数 21 s.setblocking(bool) 是否阻塞(默认为True),如果设为False,那么accept和recv时一旦无数据就会报错 22 s.accept() 默认阻塞的 23 s.connect(ip_port)连接出错会报错 24 s.connect_ex(ip_port) 连接成功返回0,出错返回编码 25 s.close() 26 s.recv(1024) 1024为最多接收的字节 27 s.recvfrom(1024) 返回值是元祖(data,address,)主要用于UDP 28 s.send() 发送的是字节(3.5) 不一定把所有消息都发完 29 s.sendall() 都发完 30 s.sendto(数据,address) 指定远程地址,主要用于UDP协议 31 s.settimeout(timeout) timeout 浮点数 单位秒,None为没有超时期 32 s.getpeername() 返回连接套接字的远程地址 元祖(ip_port)用于TCP 33 s.getsockname() 返回套接字字节的自己的地址 也是元祖 (ip_port) 用于TCP 34 s.fileno() 套接字的文件描述符 35 36 socket功能
socket功能
上面又复习了一次socket
下面我们开始分析socketserver的源码:
首先先贴出socketserver各类间的继承关系:
以上两个图包含了socketserver里的所有类和函数,方便以后查找他们之间的继承关系!图中“1”代表先继承,“2”代表后继承
现在我们来分析下面这段代码:
#/usr/bin/env python #-*- coding:utf-8 -*- #Authot:Zhang Yanimport socketserver ip_port=("127.0.0.1",9999,) class MyServer(socketserver.BaseRequestHandler):def handle(self):pass obj=socketserver.ThreadingTCPServer(ip_port,MyServer) obj.serve_forever()
MyServer类的继承关系如下:
obj=socketserver.ThreadingTCPServer(ip_port,MyServer)构建obj对象,执行ThreadingTCPServer类的__init__方法,所以obj是ThreadingTCPServer的对象
从下图可以看出执行的是TCPServer里的init方法
查看此段源码:
def __init__(self, server_address, RequestHandlerClass, bind_and_activate=True):"""Constructor. May be extended, do not override."""BaseServer.__init__(self, server_address, RequestHandlerClass) #在TCPServer的init方法里执行BaseServer的init方法self.socket = socket.socket(self.address_family,self.socket_type) #构建socket对象if bind_and_activate:try:self.server_bind() #socket的bind方法self.server_activate() #socket的listen方法except:self.server_close() #socket的close方法raise
TCPserver的init
def __init__(self, server_address, RequestHandlerClass):"""Constructor. May be extended, do not override."""self.server_address = server_addressself.RequestHandlerClass = RequestHandlerClassself.__is_shut_down = threading.Event() #执行threading.Event的init方法,构建对象self.__shutdown_request = False
BaseServer的init
obj.serve_forever(),因为obj是ThreadingTCPServer的对象,所以先在ThreadTCPServer里找,没有的话在他的父类里找,如下图:
def serve_forever(self, poll_interval=0.5):"""Handle one request at a time until shutdown.Polls for shutdown every poll_interval seconds. Ignoresself.timeout. If you need to do periodic tasks, do them inanother thread."""self.__is_shut_down.clear()try:# XXX: Consider using another file descriptor or connecting to the# socket to wake this up instead of polling. Polling reduces our# responsiveness to a shutdown request and wastes cpu at all other# times. with _ServerSelector() as selector:selector.register(self, selectors.EVENT_READ)while not self.__shutdown_request:ready = selector.select(poll_interval)if ready:self._handle_request_noblock() #其他地方先不考虑,先看这两行,_handle_request_noblock是BaseServer的私有方法self.service_actions() #self是obj,是ThreadTCPServer的对象,需要根据继承关系找到service_actions()方法finally:self.__shutdown_request = Falseself.__is_shut_down.set()
BaseServer的serve_forever
转载于:https://www.cnblogs.com/meitangyanyan/p/5660176.html
python成长之路10——socketserver源码分析相关推荐
- Linux kernel 3.10内核源码分析--进程上下文切换
一.疑问 进程调度时,当被选中的next进程不是current进程时,需要进行上下文切换. 进行上下文切换时,有一些问题不太容易理解,比如: 1.进程上下文切换必然发生在内核态吗? 2.上下文切换后原 ...
- 【我的架构师之路】- golang源码分析之协程调度器底层实现( G、M、P)
本人的源码是基于go 1.9.7 版本的哦! 紧接着之前写的 [我的区块链之路]- golang源码分析之select的底层实现 和 [我的区块链之路]- golang源码分析之channel的底层实 ...
- Python之socketserver源码分析
一.socketserver简介 socketserver是一个创建服务器的框架,封装了许多功能用来处理来自客户端的请求,简化了自己写服务端代码.比如说对于基本的套接字服务器(socket-based ...
- python打蛇_hprose for java源码分析-1 初识
1.1初识 hprose是个开源RPC框架.支持语言 JAVA, C#,C++,Python,PHP等一系列语言.这里着重分析下hprose for java源码. 可以到https://github ...
- 多线程高并发编程(10) -- ConcurrentHashMap源码分析
一.背景 前文讲了HashMap的源码分析,从中可以看到下面的问题: HashMap的put/remove方法不是线程安全的,如果在多线程并发环境下,使用synchronized进行加锁,会导致效率低 ...
- Activity启动过程——10.0源码分析
对于一个activity,注意不是根activity,它的启动流程往往是通过创建intent,通过startActivity()的方式启动的,我们跟踪的就是安卓10.0这部分的启动流程. 在windo ...
- Linux Kernel 3.10内核源码分析--块设备层request plug/unplug机制
一.基本原理 Linux块设备层使用了plug/unplug(蓄流/泄流)的机制来提升IO吞吐量.基本原理为:当IO请求提交时,不知直接提交给底层驱动,而是先将其放入一个队列中(相当于水池),待一定时 ...
- Linux kernel 3.10内核源码分析--TLB相关--TLB概念、flush、TLB lazy模式
一.概念及基本原理 TLB即Translation Lookaside Buffer,是MMU中的一种硬件cache,用于缓存页表,即缓存线性地址(虚拟地址)到物理地址的映射关系. 如果没有TLB,那 ...
- ernel 3.10内核源码分析--KVM相关--虚拟机运行
1.基本原理 KVM虚拟机通过字符设备/dev/kvm的ioctl接口创建和运行,相关原理见之前的文章说明. 虚拟机的运行通过/dev/kvm设备ioctl VCPU接口的KVM_RUN指令实现, 在 ...
最新文章
- 我与前端之间不得不说的三天两夜之javaScript
- -lt -gt -ge -le -eq的意义
- 2021年春季学期-信号与系统-第二次作业参考答案-第三小题
- Python+opencv 机器视觉 - 基于霍夫圈变换算法检测图像中的圆形实例演示
- python特征工程插件_python特征工程
- Android Studio稍微较新的版本下载
- RTF 文件格式解析
- 怎么查看ubuntu虚拟机ip地址?
- 【地球科学】常用的地理投影坐标系介绍(笔记)
- vue中使用微信jssdk语音聊天功能,实现语音输入内容的van-field输入框组件
- Affinity Photo for Mac(修图软件)
- 只需10分钟,给你全世界!水经注全球三维离线GIS系统
- Photoshop如何查看各种字体
- sublime text 输入法中文不聚焦问题,安装IMESupport,之后还需要换输入法
- MATLAB | 官方自带的绘图代码生成功能咋用
- sdram/ddr 功耗计算
- WCDMA的R99版本网络结构
- [SQL Server] sp_who, sp_who2和sp_who3
- k8s部署Traefik
- 550分左右的理科大学计算机,理科考550分左右可以报考哪些大学2021
热门文章
- 5条能让web前端至少手拿20万年薪的特性!
- web前端开发要不要找个师傅带?
- 7-4 sdut-运输计费问题 (10 分)python
- 如何创建一个Mybatis程序,实现对数据库的简单查询?
- ucosii 如何确定定时器的时间_全国中小学寒假时间确定,家长如何安排孩子们假期更合理?...
- python成绩转换_Python格式化输出%与format能不能互相转换?
- python 读取鼠标选中文本_python怎么读取文本文件
- 安卓开发仿微信图片拖拽_Android 仿微信朋友圈图片拖拽返回
- shell条件判断 if else
- python实现whois查询_利用Python实现域名查询和whois查询