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源码分析相关推荐

  1. Linux kernel 3.10内核源码分析--进程上下文切换

    一.疑问 进程调度时,当被选中的next进程不是current进程时,需要进行上下文切换. 进行上下文切换时,有一些问题不太容易理解,比如: 1.进程上下文切换必然发生在内核态吗? 2.上下文切换后原 ...

  2. 【我的架构师之路】- golang源码分析之协程调度器底层实现( G、M、P)

    本人的源码是基于go 1.9.7 版本的哦! 紧接着之前写的 [我的区块链之路]- golang源码分析之select的底层实现 和 [我的区块链之路]- golang源码分析之channel的底层实 ...

  3. Python之socketserver源码分析

    一.socketserver简介 socketserver是一个创建服务器的框架,封装了许多功能用来处理来自客户端的请求,简化了自己写服务端代码.比如说对于基本的套接字服务器(socket-based ...

  4. python打蛇_hprose for java源码分析-1 初识

    1.1初识 hprose是个开源RPC框架.支持语言 JAVA, C#,C++,Python,PHP等一系列语言.这里着重分析下hprose for java源码. 可以到https://github ...

  5. 多线程高并发编程(10) -- ConcurrentHashMap源码分析

    一.背景 前文讲了HashMap的源码分析,从中可以看到下面的问题: HashMap的put/remove方法不是线程安全的,如果在多线程并发环境下,使用synchronized进行加锁,会导致效率低 ...

  6. Activity启动过程——10.0源码分析

    对于一个activity,注意不是根activity,它的启动流程往往是通过创建intent,通过startActivity()的方式启动的,我们跟踪的就是安卓10.0这部分的启动流程. 在windo ...

  7. Linux Kernel 3.10内核源码分析--块设备层request plug/unplug机制

    一.基本原理 Linux块设备层使用了plug/unplug(蓄流/泄流)的机制来提升IO吞吐量.基本原理为:当IO请求提交时,不知直接提交给底层驱动,而是先将其放入一个队列中(相当于水池),待一定时 ...

  8. Linux kernel 3.10内核源码分析--TLB相关--TLB概念、flush、TLB lazy模式

    一.概念及基本原理 TLB即Translation Lookaside Buffer,是MMU中的一种硬件cache,用于缓存页表,即缓存线性地址(虚拟地址)到物理地址的映射关系. 如果没有TLB,那 ...

  9. ernel 3.10内核源码分析--KVM相关--虚拟机运行

    1.基本原理 KVM虚拟机通过字符设备/dev/kvm的ioctl接口创建和运行,相关原理见之前的文章说明. 虚拟机的运行通过/dev/kvm设备ioctl VCPU接口的KVM_RUN指令实现, 在 ...

最新文章

  1. 我与前端之间不得不说的三天两夜之javaScript
  2. -lt -gt -ge -le -eq的意义
  3. 2021年春季学期-信号与系统-第二次作业参考答案-第三小题
  4. Python+opencv 机器视觉 - 基于霍夫圈变换算法检测图像中的圆形实例演示
  5. python特征工程插件_python特征工程
  6. Android Studio稍微较新的版本下载
  7. RTF 文件格式解析
  8. 怎么查看ubuntu虚拟机ip地址?
  9. 【地球科学】常用的地理投影坐标系介绍(笔记)
  10. vue中使用微信jssdk语音聊天功能,实现语音输入内容的van-field输入框组件
  11. Affinity Photo for Mac(修图软件)
  12. 只需10分钟,给你全世界!水经注全球三维离线GIS系统
  13. Photoshop如何查看各种字体
  14. sublime text 输入法中文不聚焦问题,安装IMESupport,之后还需要换输入法
  15. MATLAB | 官方自带的绘图代码生成功能咋用
  16. sdram/ddr 功耗计算
  17. WCDMA的R99版本网络结构
  18. [SQL Server] sp_who, sp_who2和sp_who3
  19. k8s部署Traefik
  20. 550分左右的理科大学计算机,理科考550分左右可以报考哪些大学2021

热门文章

  1. 5条能让web前端至少手拿20万年薪的特性!
  2. web前端开发要不要找个师傅带?
  3. 7-4 sdut-运输计费问题 (10 分)python
  4. 如何创建一个Mybatis程序,实现对数据库的简单查询?
  5. ucosii 如何确定定时器的时间_全国中小学寒假时间确定,家长如何安排孩子们假期更合理?...
  6. python成绩转换_Python格式化输出%与format能不能互相转换?
  7. python 读取鼠标选中文本_python怎么读取文本文件
  8. 安卓开发仿微信图片拖拽_Android 仿微信朋友圈图片拖拽返回
  9. shell条件判断 if else
  10. python实现whois查询_利用Python实现域名查询和whois查询