参考:https://blog.csdn.net/qq_33733970/article/details/79153938

1.功能简介

  • socketserver模块是对socket模块的再封装,用于简化网络服务器的编写,并且实现了多用户的在线,即多并发

2.功能分类

#处理链路问题server类
+------------+
| BaseServer |
+------------+
|
v
+-----------+ +------------------+
| TCPServer |------->| UnixStreamServer |
+-----------+ +------------------+
|
v
+-----------+ +--------------------+
| UDPServer |------->| UnixDatagramServer |
+-----------+ +--------------------+
  
#处理多线程并发:
  "ThreadingMixIn","ThreadingUDPServer","ThreadingTCPServer"
  #处理多进程并发:
  "ForkingUDPServer","ForkingTCPServer", "ForkingMixIn"
#处理通信问题request类
  "BaseRequestHandler", "StreamRequestHandler","DatagramRequestHandler"

3.类继承关系

●处理多线程并发相关类继承关系

threading-inherit-relation

●处理多进程并发相关类继承关系

forking-inherit-relation

●处理通信request相关类继承关系

request-inherit-relation

 4.如何创建socketserver服务

①创建一个请求处理类(FtpServer),继承BaseRequestHandler类,并重写父类handle()方法;
②实例化服务器类(TCPServer、UDPServer、UnixStreamServer或UnixDatagramServer),传入(IP, 端口)及定制的请求处理类(FtpServer);
③server.handle_requese() #只处理一个请求
④server.server_forever() #处理多个请求
⑤server.server_close() #关闭socket

5.基于TCP协议实现的FTPServer服务调用过程解析

import socketserver

class FtpServer(socketserver.BaseRequestHandler):
def handle(self):
pass
ftpserver = socketserver.ThreadingTCPServer(('127.0.0.1', 8080), FtpServer) ftpserver.serve_forever()
1.属性解析顺序
ThreadingTCPServer-->ThreadingMixIn-->TCPServer-->BaseServer
2.调用TCPSever类的__init__方法获取实例化对象
class TCPServer(BaseServer):
def __init__(self, server_address, RequestHandlerClass, bind_and_activate=True):
self.server_bind()
self.server_activate()
3.调用BaseServer类的server_forever方法,并处理请求
class BaseServer:
def serve_forever(self, poll_interval=0.5):
self._handle_request_noblock() def _handle_request_noblock(self):
"""相当于TCPServer中的self.socket.accept()"""
request, client_address = self.get_request()
"""接收请求,并处理来次客户端的请求"""
self.process_request(request, client_address)
4.调用ThreadingMixIn类的process_request方法,执行process_request_thread方法
class ThreadingMixIn:
def process_request_thread(self, request, client_address):
self.finish_request(request, client_address) def process_request(self, request, client_address):
"""开启新线程处理请求"""
t = threading.Thread(target = self.process_request_thread, args = (request, client_address))
t.daemon = self.daemon_threads
t.start()
5.调用BaseServer类的finish_request方法,完成请求,至此链接循环的处理完成,开始通讯循环
def finish_request(self, request, client_address):
"""通过实例化定制类(FtpServer)去结束一个请求"""
self.RequestHandlerClass(request, client_address, self)
6.调用BaseRequestHandler类的__init__方法
class BaseRequestHandler:
def __init__(self, request, client_address, server):
"""
     调用了对象自己的handle()方法
     服务端跟客户端所有的交互都在重写的handle()方法中
     """
self.handle()

Python socketserver模块解析的更多相关文章

  1. socketserver模块解析

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

  2. python socketserver框架解析

    socketserver框架是一个基本的socket服务器端框架, 使用了threading来处理多个客户端的连接, 使用seletor模块来处理高并发访问, 是值得一看的python 标准库的源码之 ...

  3. python argparse模块解析命令行选项简单使用

    argparse模块的解析命令行选项简单使用 util.py #!/usr/bin/env python # coding=utf-8 import argparse parser = argpars ...

  4. Python requests模块解析XML

    检查QQ是否在线(api感觉不准) import requests from xml.etree import ElementTree qq_str = input('please input the ...

  5. python - socketserver 模块应用

    server端: import socketserver import subprocess import json import struct class MyTCPHandler(socketse ...

  6. python 常用模块之ConfigParser

    在程序中使用配置文件来灵活的配置一些参数是一件很常见的事情,配置文件的解析并不复杂,在Python里更是如此,在官方发布的库中就包含有做这件事情的库,那就是ConfigParser, Python C ...

  7. Python之路(第三十三篇) 网络编程:socketserver深度解析

    一.socketserver 模块介绍 socketserver是标准库中的一个高级模块,用于网络客户端与服务器的实现.(version = "0.4") 在python2中写作S ...

  8. python 网络编程之socket开发和socketserver模块

    一 客户端/服务器架构 1.硬件C/S架构(打印机) 2.软件C/S架构 互联网中处处是C/S架构 如黄色网站是服务端,你的浏览器是客户端(B/S架构也是C/S架构的一种) 腾讯作为服务端为你提供视频 ...

  9. 浅析python中socketserver模块使用

    虽然说用python编写简单的网络程序狠方便,但是复杂一点的网络程序还是用现成的框架比较好,这样就可以专心事物逻辑,而不是套接字的各种细节.Socketserver模块简化了编写网络服务程序,同时so ...

随机推荐

  1. 利用System.Uri转URL为绝对地址

    在使用ASPOSE.Word生成Word文档时可以通过InsertHtml(html)来将图文信息写入Word文档(图片内嵌),但要求html里图片的src是绝对全路径,所以需要对html进行转化. ...

  2. Nodejs----基本数据类型

    Nodejs基本数据类型: nodejs的基础JavaScript(脚本语言). 而大多数的

  3. day7 七、字符编码,字符字节与文件操作

    一.字符编码 1.定义:人类能识别的是字符等高级标识符,电脑只能识别0,1组成的标识符,要完成人与机器之间的信息交流,一定需要一个媒介,进行两种标识符的转化(两种标识符的对应关系) 对应关系形成的结构 ...

  4. bochs

    ● 制作一个硬盘 ./bximage 步骤与制作软盘的相似,完成后将bochs软件提示的最后一句话,添加到自己的配置文件里: dd if=loader.bin of=~/Softwares/bochs ...

  5. 洛谷P1088 火星人【STL】【思维】

    题目:https://www.luogu.org/problemnew/show/P1088 题意: 给定一个n个数的排列,要求得到这之后的第m个排列. 思路: next_permutation的简单 ...

  6. F#周报2018年第48期

    新闻 F#2018年圣诞日历 Mac上的Visual Studio 2017新版本7.7 Rider 2018.3将引入远程调试功能 Visual Studio 2017新版本15.9.3 视频及幻灯 ...

  7. {MySQL的逻辑查询语句的执行顺序}一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析

    MySQL的逻辑查询语句的执行顺序 阅读目录 一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析 一 SEL ...

  8. plsql developer 安装

    PLSQL Developer 安装分以下几步: 一.下载Oracle客户端 PLSQL Developer是通过oracle client连上Oracle server的. http://www.o ...

  9. C和C指针小记(二)-注释,三字母词,编译选项

    课后的几个问题: 1) int x/*blah blah*/y; 会有什么问题? 答:编译器报错,语句中不应该有多行注释 单行注释也应该放到语句后面或者独自占一行. 2)打出下面一行字符串(包括引号) ...

  10. book_lsit

    @ 学习go的轮廓.核心.难点  必看 <代码的未来> 3.2 Go ~page 123~ @ 学习内存架构.内存管理的入门.原理    必看 <操作系统之哲学原理>邹恒明 @ ...