s = socket.socket(socket.AF_INET,socket.SOCK_STREAM,0)

 参数一:地址簇
socket.AF_INET ipv4(默认)
socket.AF_INET6 ipv6 socket.AF_UNIX 本地进程间通信 参数二:类型
socket.SOCK_STREAM 流式socket,TCP(默认)
socket.SOCK_DGRAM 数据报式socket,UDP
socket.SOCK_RAW 原始套接字,ICMP,IGMP
socket.SOCK_RDM 可靠的UDP形式
socket.SOCK_SEQPACKET 可靠的连续数据包服务 参数三:协议
0 (默认) 与特定地址家族相关的协议,如果是0,则系统会根据地址格式和套接类别,自动选择一个合适的协议 s.bind(ip_port)
s.listen(backlog) backlog:最大挂起数
s.setblocking(bool) 是否阻塞(默认为True),如果设为False,那么accept和recv时一旦无数据就会报错
s.accept() 默认阻塞的
s.connect(ip_port)连接出错会报错
s.connect_ex(ip_port) 连接成功返回0,出错返回编码
s.close()
s.recv(1024) 1024为最多接收的字节
s.recvfrom(1024) 返回值是元祖(data,address,)主要用于UDP
s.send() 发送的是字节(3.5) 不一定把所有消息都发完
s.sendall() 都发完
s.sendto(数据,address) 指定远程地址,主要用于UDP协议
s.settimeout(timeout) timeout 浮点数 单位秒,None为没有超时期
s.getpeername() 返回连接套接字的远程地址 元祖(ip_port)用于TCP
s.getsockname() 返回套接字字节的自己的地址 也是元祖 (ip_port) 用于TCP
s.fileno() 套接字的文件描述符 socket功能

socket功能

上面又复习了一次socket

下面我们开始分析socketserver的源码:

首先先贴出socketserver各类间的继承关系:

以上两个图包含了socketserver里的所有类和函数,方便以后查找他们之间的继承关系!图中“1”代表先继承,“2”代表后继承

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

#/usr/bin/env python
#-*- coding:utf-8 -*-
#Authot:Zhang Yan import 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_address
self.RequestHandlerClass = RequestHandlerClass
self.__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. Ignores
self.timeout. If you need to do periodic tasks, do them in
another 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 = False
self.__is_shut_down.set()

BaseServer的serve_forever

 

 

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. Ping pong(树状数组经典)

    Ping pong Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  2. iOS 面试题:OC基本概念题

    1.什么是类和对象? 类是一组具有同样特征和功能的事物的抽象 对象描写叙述了一个物体的特征和行为实现 类是对象的抽象 对象是类的实例 2.OC中定义类,创建对象,使用对象. OC中定义类分为接口部分, ...

  3. 如何用LinkedHashMap实现LRU缓存算法

    阿里巴巴笔试考到了LRU,一激动忘了怎么回事了..准备不充分啊.. 缓存这个东西就是为了提高运行速度的,由于缓存是在寸土寸金的内存里面,不是在硬盘里面,所以容量是很有限的.LRU这个算法就是把最近一次 ...

  4. 关于Windows Phone的资源文件Build Action属性

    最近一朋友问了一个问题,他想引用一个本地图片到页面上的Image控件,可是发现用Application的GetResourceStream得到的结果是个null值,当时第一个想到的就是他图片的Buil ...

  5. 通过配置Tomcat,让Android真机通过局域网访问PC的文件

    在 Tomcat 根目录,找到conf\server.xml文件. 1.打开server.xml查找修改端口为8080端口: <Connector port="8080" p ...

  6. C#复习三(Day 22)

    哈哈,又到了总结的时间了.今天还是在继续复习C#的基础语法.这次总结主要以一下小程序为主. Split()的运用 123-456---789-----123-2把类似的字符串中重复符号去掉,得到123 ...

  7. iOS 7 标签栏控制器进行模态视图跳转后变成透明

    要解决此问题,需要设置tabBar的如下属性: self.tabBar.translucent = NO;

  8. iOS 中多线程的简单使用

    iOS中常用的多线程操作有( NSThread, NSOperation GCD ) 为了能更直观的展现多线程操作在SB中做如下的界面布局: 当点击下载的时候从网络上下载图片: - (void)loa ...

  9. Android应用开发实例篇(1)-----简易涂鸦板

    链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/03/2378328.html 一.概述 这次要做一个简单的涂鸦板应用,以前在Qt上实现过,突然想 ...

  10. c++ primer plus 习题答案(7)

    p427.4 //头文件: #include<iostream> #ifndef STACK_H_ #define STACK_H_ typedef unsigned long Item; ...