一、socketserver模块介绍

Python提供了两个基本的socket模块。一个是socket,它提供了标准的BSD Socket API; 另一个是socketserver,它提供了服务器中心类,可以简化网络服务器的开发

  socketserver

socketserver内部使用IO多路复用以及“多线程”和“多进程”,从而实现并发处理多个客户端请求的socket服务端。 即,每个客服端请求连接到服务器时,socket服务端都会在服务器上创建一个“线程”或“进程”专门负责处理当前客户端的所有请求。

二、socketserver中的ThreadingTCPServer类

ThreadingTCPServer实现的socket服务器内部会为每个client创建一个“线程”,该线程用来和客户端就行交互 ThreadingTCPServer源码内容:

class ThreadingTCPServer(ThreadingMixIn, TCPServer): pass#可以看到ThreadTCPServer类本身并没有方法,而是继承了(ThreadingMinIn, TCPServer) 这两个类。 而TCPServer则是继承了BaseServer类。

三、ThreadingTCPServer的使用方法

1、创建一个继承socketserver.BaseRequestHandler的类

2、类中必须重写一个名为handler的方法

3、实例化一个服务器类,传入服务器的地址和请求处理程序类

4、调用serve_forever()事件循环监听

 1 #!/usr/bin/env python3
 2 import socketserver
 3
 4 class Handler(socketserver.BaseRequestHandler):    # 必须继承BaseRequestHandler
 5     def handle(self):        # 必须有handle方法
 6         print('New connection:',self.client_address)
 7         while True:
 8             data = self.request.recv(1024)
 9             if not data:break
10             print('Client data:',data.decode())
11             self.request.send(data)
12
13 if __name__ == '__main__':
14     server = socketserver.ThreadingTCPServer(('127.0.0.1',8009),Handler)    # 实例化对象,实现多线程的socket
15     server.serve_forever()    # 事件监听,并调用handler方法

View Code

四、ThreadingTCPServer执行过程

1、启动服务端程序

2、执行TCPServer.__init__方法,创建服务端socket对象并绑定IP和端口(根据类的继承关系,即查找顺序找到TCPServer.__init__())

3、执行BaseServer.__init__方法,将自定义的继承自socketserver.BaseRequestHandler的类MyRequestHandler赋值给self.RequestHandlerClass class TCPServer(BaseServer): #(继承了BaseServeer类)

 1 class TCPServer(BaseServer): #(继承了BaseServeer类)
 2     def __init__(self, server_address, RequestHandlerClass, bind_and_activate=True):
 3         """Constructor.  May be extended, do not override."""
 4         BaseServer.__init__(self, server_address, RequestHandlerClass)  #(重写了BaseServer的__init__方法)
 5         self.socket = socket.socket(self.address_family,
 6                                     self.socket_type)
 7         if bind_and_activate:
 8             try:
 9                 self.server_bind()
10                 self.server_activate()
11             except:
12                 self.server_close()
13                 raise
14
15 class BaseServer:
16     def __init__(self, server_address, RequestHandlerClass):  #(接收了两个传进来的参数)
17         """Constructor.  May be extended, do not override."""
18         self.server_address = server_address
19         self.RequestHandlerClass = RequestHandlerClass     #(赋值给了self.RequestHandlerClass)
20         self.__is_shut_down = threading.Event()
21         self.__shutdown_request = False

View Code

4、通过实例化的对象,执行serve_forever方法,该方法首先查找到BaseServer下的方法,通过调用selector模块,注册事件监听对象,并执行_handle_request_noblock方法 找到此方法,并调用该方法下的process_request方法,在此调用到finish_request方法,通过finish_request方法,执行了RequestHandlerClass方法,执行此方法就相当于调用 了我们重写的Handler类。

 1 class BaseServer:
 2     def serve_forever(self, poll_interval=0.5):
 3         try:
 4             with _ServerSelector() as selector:
 5                 selector.register(self, selectors.EVENT_READ)
 6
 7                 while not self.__shutdown_request:
 8                     ready = selector.select(poll_interval)
 9                     if ready:
10                         self._handle_request_noblock()
11
12                     self.service_actions()
13    def _handle_request_noblock(self):
14         try:
15             request, client_address = self.get_request()
16         except OSError:
17             return
18         if self.verify_request(request, client_address):
19             try:
20                 self.process_request(request, client_address)
21             except Exception:
22                 self.handle_error(request, client_address)
23                 self.shutdown_request(request)
24             except:
25                 self.shutdown_request(request)
26                 raise
27         else:
28             self.shutdown_request(request)
29     def process_request(self, request, client_address):
30         self.finish_request(request, client_address)
31         self.shutdown_request(request)
32     def finish_request(self, request, client_address):
33         self.RequestHandlerClass(request, client_address, self)

View Code

5、通过Handler类实例化对象,调用继承的BaseRequestHandler类中的__init__方法,并执行了handler方法。 从而运行了我们重写Handler类中的handler方法。

class BaseRequestHandler:def __init__(self, request, client_address, server):self.request = requestself.client_address = client_addressself.server = serverself.setup()try:self.handle()   #调用handler()finally:self.finish()

View Code

五、调用流程图

转载于:https://www.cnblogs.com/eric_yi/p/7701381.html

socketserver模块使用方法相关推荐

  1. python socket tcp客户端_python网络编程socketserver模块(实现TCP客户端/服务器)

    摘录python核心编程 socketserver(python3.x版本重新命名)是标准库中的网络编程的高级模块.通过将创建网络客户端和服务器所必须的代码封装起来,简化了模板,为你提供了各种各样的类 ...

  2. socketserver模块解析

    socketserver模块是基于socket而来的模块,它是在socket的基础上进行了一层封装,并且实现并发等功能. 看看具体用法: ​x import socketserver #1.引入模块 ...

  3. python3 socketserver模块 网络服务编程框架

    socket编程过于底层,编程虽然有套路,但是想要写出健壮的代码还是比较困难的,所以很多语言都对socket底层 API进行封装,Python的封装就是--socketserver模块.它是网络服务编 ...

  4. python3 socketserver_《Python核心编程(第3版)》——2.5 *SocketServer模块

    本节书摘来自异步社区<Python核心编程(第3版)>一书中的第2章,第2.5节,作者[美] Wesley Chun(卫斯理 春),孙波翔 李斌 李晗 译,更多章节内容可以访问云栖社区&q ...

  5. 基于UDP协议的套接字+socketserver模块

    基于UDP协议的套接字 user datagram protocal 数据报协议 无双向通道.自带报头.类似发短信.不会粘包 不可靠:数据发送时,丢就丢了 UDP socket: 服务端: impor ...

  6. SocketServer模块,hmac模块验证client合法性

    hmac模块: 1.模块初识: import hmac # h = hmac.new() #括号里要给它连个bytes类型,一个是自定义的secret_key,一个是你想进行加密的bytes # 密文 ...

  7. python 内置标准库socketserver模块的思考

    socketserver模块简化了编写网络服务器的任务, 在很大程度上封装了一些操作, 你可以看成是事件驱动型的设计, 这很不错.它定义了两个最基本的类--服务器类 BaseServer, 请求处理类 ...

  8. Python之网络编程(socketserver模块详解、链接认证)

    文章目录 多线程对多客户端 socketserver 分类(2种) 12个类的继承关系(原理) socketserver的实现效果 认证链接的合法性 加盐(hmac) 对暗号 socketserver ...

  9. 网络编程中客户端链接的合法性,socketserver模块

    客户端链接的合法性 验证合法性: 首先,我们来探讨一下,什么叫验证合法性, 举个例子:有一天,我开了一个socket服务端,只想让咱们这个班的同学使用,但是有一天,隔壁班的同学过来问了一下我开的这个服 ...

最新文章

  1. Communications link failure
  2. chrome友好显示json字符串
  3. 传递function_boost库function与bind
  4. 想创业没有资金,如何获得启动资金?
  5. inception_Inception团队在Red Hat推出DevOps
  6. python实现表格_Python 自由定制表格的实现示例
  7. FileSystemObject ADO WScript.Shell
  8. go mysql 初窥。查询
  9. 西门子S7系列中间人攻击:PLC探测和流量分析(二)
  10. matlab做高斯滤波,matlab高斯滤波自定义函数怎么做
  11. Linux在Ubuntu下安装TFTP
  12. QTreeView实现圆角样式
  13. IG541----数据中心首选气体灭火系统
  14. heartbeat如何监控程序_Nagios监控Heartbeat
  15. oracle11g 网页账号,oracle11g 创建用户并受权
  16. 解密DB2独步江湖之五大法宝
  17. cmd 命令行窗口切换目录 cd 命令操作方法
  18. 输入每月本金,年利率,月份求复利值
  19. Redis散列表(hash)使用
  20. 信息解码(ACM)刘汝佳

热门文章

  1. emqtt 试用(七)追踪
  2. CSS缩小窗口时,背景图出现右侧空白
  3. JS+PHP实现登录后自动执行之前的操作
  4. 22Exchange Server 2010跨站点部署-邮件流测试及重定向
  5. shellcode xor编码/解码[1]
  6. 常用的正则表达式-收藏版
  7. Code Chef May Challenge 2019题解
  8. 【树莓派】服务配置相关3:基于Ubuntu Server的服务配置
  9. 马斯克造“超级WiFi”这事儿未必能成
  10. 易观的大数据革命 分析师与机器人协同办公