python socketserver模块_Python socketserver模块解析

参考: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服务调用过程解析

importsocketserverclassFtpServer(socketserver.BaseRequestHandler):defhandle(self):passftpserver= socketserver.ThreadingTCPServer(('127.0.0.1', 8080), FtpServer)

ftpserver.serve_forever()

1.属性解析顺序

ThreadingTCPServer-->ThreadingMixIn-->TCPServer-->BaseServer

2.调用TCPSever类的__init__方法获取实例化对象

classTCPServer(BaseServer):def __init__(self, server_address, RequestHandlerClass, bind_and_activate=True):

self.server_bind()

self.server_activate()

3.调用BaseServer类的server_forever方法,并处理请求

classBaseServer: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方法

classThreadingMixIn:defprocess_request_thread(self, request, client_address):

self.finish_request(request, client_address)defprocess_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方法,完成请求,至此链接循环的处理完成,开始通讯循环

deffinish_request(self, request, client_address):"""通过实例化定制类(FtpServer)去结束一个请求"""self.RequestHandlerClass(request, client_address, self)

6.调用BaseRequestHandler类的__init__方法

classBaseRequestHandler:def __init__(self, request, client_address, server):"""调用了对象自己的handle()方法

服务端跟客户端所有的交互都在重写的handle()方法中"""self.handle()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值