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 流式socketTCP(默认)
  11. socket.SOCK_DGRAM 数据报式socketUDP
  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,那么acceptrecv时一旦无数据就会报错
  22. s.accept() 默认阻塞的
  23. s.connectip_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”代表后继承

现在我们来分析下面这段代码:

  1. #/usr/bin/env python
  2. #-*- coding:utf-8 -*-
  3. #Authot:Zhang Yan
  4.  
  5. import socketserver
  6. ip_port=("127.0.0.1",9999,)
  7. class MyServer(socketserver.BaseRequestHandler):
  8. def handle(self):
  9. pass
  10. obj=socketserver.ThreadingTCPServer(ip_port,MyServer)
  11. obj.serve_forever()

MyServer类的继承关系如下:

  1. obj=socketserver.ThreadingTCPServer(ip_port,MyServer)
    构建obj对象,执行ThreadingTCPServer类的__init__方法,所以objThreadingTCPServer的对象
  1. 从下图可以看出执行的是TCPServer里的init方法

  1. 查看此段源码:
  1. def __init__(self, server_address, RequestHandlerClass, bind_and_activate=True):
  2. """Constructor. May be extended, do not override."""
  3. BaseServer.__init__(self, server_address, RequestHandlerClass) #在TCPServer的init方法里执行BaseServer的init方法
  4. self.socket = socket.socket(self.address_family,
  5. self.socket_type) #构建socket对象
  6. if bind_and_activate:
  7. try:
  8. self.server_bind() #socket的bind方法
  9. self.server_activate() #socket的listen方法
  10. except:
  11. self.server_close() #socket的close方法
  12. raise

TCPserver的init

  1. def __init__(self, server_address, RequestHandlerClass):
  2. """Constructor. May be extended, do not override."""
  3. self.server_address = server_address
  4. self.RequestHandlerClass = RequestHandlerClass
  5. self.__is_shut_down = threading.Event() #执行threading.Event的init方法,构建对象
  6. self.__shutdown_request = False

BaseServer的init

  1. obj.serve_forever(),因为objThreadingTCPServer的对象,所以先在ThreadTCPServer里找,没有的话在他的父类里找,如下图:

  1. def serve_forever(self, poll_interval=0.5):
  2. """Handle one request at a time until shutdown.
  3.  
  4. Polls for shutdown every poll_interval seconds. Ignores
  5. self.timeout. If you need to do periodic tasks, do them in
  6. another thread.
  7. """
  8. self.__is_shut_down.clear()
  9. try:
  10. # XXX: Consider using another file descriptor or connecting to the
  11. # socket to wake this up instead of polling. Polling reduces our
  12. # responsiveness to a shutdown request and wastes cpu at all other
  13. # times.
  14. with _ServerSelector() as selector:
  15. selector.register(self, selectors.EVENT_READ)
  16.  
  17. while not self.__shutdown_request:
  18. ready = selector.select(poll_interval)
  19. if ready:
  20. self._handle_request_noblock() #其他地方先不考虑,先看这两行,_handle_request_noblock是BaseServer的私有方法
  21. self.service_actions() #self是obj,是ThreadTCPServer的对象,需要根据继承关系找到service_actions()方法
  22. finally:
  23. self.__shutdown_request = False
  24. self.__is_shut_down.set()

BaseServer的serve_forever

  1.  
  1.  
  1.  

python成长之路10——socketserver源码分析的更多相关文章

  1. python day 15: IO多路复用,socketserver源码培析,

    目录 python day 15 1. IO多路复用 2. socketserver源码分析 python day 15 2019/10/20 学习资料来自老男孩教育 1. IO多路复用 ''' I/ ...

  2. kernel 3.10内核源码分析--hung task机制

    kernel 3.10内核源码分析--hung task机制 一.相关知识: 长期以来,处于D状态(TASK_UNINTERRUPTIBLE状态)的进程 都是让人比较烦恼的问题,处于D状态的进程不能接 ...

  3. python成长之路10

    断点续传   python2.7 多继承  py35多继承   socketserver源码     支持并发处理socket   i/o多路复用   上节回顾     socket          ...

  4. python基础-11 socket,IO多路复用,select伪造多线程,select读写分离。socketserver源码分析

    Socket socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. sock ...

  5. Python之socketserver源码分析

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

  6. Python 日志打印之logging.getLogger源码分析

    日志打印之logging.getLogger源码分析 By:授客 QQ:1033553122 #实践环境 WIN 10 Python 3.6.5 #函数说明 logging.getLogger(nam ...

  7. Python学习---Django的request.post源码分析

    request.post源码分析: 可以看到传递json后会帮我们dumps处理一次最后一字节形式传递过去

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

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

  9. Python创建容器和集合之源码分析

    _collections_abc.py文件中提供了许多抽象基类,这些类将集合分解成许多互相独立的属性集 __all__ = ["Awaitable", "Coroutin ...

随机推荐

  1. 老生常谈--Js继承小结

    一直以来,对Js的继承有所认识,但是认识不全面,没什么深刻印象.于是,经常性的浪费很多时间重新看博文学习继承,今天工作不是特别忙,有幸看到了http://www.slideshare.net/stoy ...

  2. Oracle中对时间操作的一些总结

    sysdate+(5/24/60/60) 在系统时间基础上延迟5秒 sysdate+5/24/60 在系统时间基础上延迟5分钟 sysdate+5/24 在系统时间基础上延迟5小时 sysdate+5 ...

  3. swig模板 html代码自然状态下输出是转义的,必须加一个函数来转换为html代码;

    <div>{{o.content|raw}}</div> |raw 相当于一个函数,转义函数,最终输出结果为html代码:

  4. fastDFS同步问题讨论

    一.文件同步延迟问题 前面也讲过fastDFS同组内storage server数据是同步的, Storage server中由专门的线程根据binlog进行文件同步.为了最大程度地避免相互影响以及出 ...

  5. sharepoint 2013 文档库 资源管理器打开报错 在文件资源管理器中打开此位置时遇到问题,将此网站添加到受信任站点列表,然后重试。

    我们在使用sharepoint 2013的文档库或者资源库的时候,经常会需要用到使用“资源管理器”来管理文档,但是有时候,点击“使用资源管理器打开”,会提示如下错误: 在文件资源管理器中打开此位置时遇 ...

  6. jQuery validate api(转)

    官网地址:http://bassistance.de/jquery-plugins/jquery-plugin-validation jQuery plugin: Validation 使用说明 转载 ...

  7. css3选择器的比较(三) -- 元素选择器 (+, ~)

    元素选择器中w3cschool中有些翻译不太准确 比如 +:其实是与element1元素同级,位于element1元素之后的第一个element2元素 ~:其实是与element1元素同级,位于ele ...

  8. mysql 更改自动增长列的初始值

    alter table t_Myxiao7 AUTO_INCREMENT 3;   -- 从三开始 ITOKIT.COM提示:如果表中数据没有用.如果直接删除数据,自动增长ID还是不会从1开始的,可以 ...

  9. BZOJ 2662: [BeiJing wc2012]冻结(最短路)

    这道题和 BZOJ 2763飞行路线 几乎一模一样..然后飞行路线我是1A,这道题WA了4次,我开始怀疑我的智商了.. ---------------------------------------- ...

  10. codeforces 616E. Sum of Remainders 数学

    题目链接 给两个数n, m. 求n%1+n%2+.......+n%m的值. 首先, n%i = n-n/i*i, 那么原式转化为n*m-sigma(i:1 to m)(n/i*i). 然后我们可以发 ...