码迷,mamicode.com
首页 > 编程语言 > 详细

python——网络编程

时间:2017-06-03 00:54:43      阅读:250      评论:0      收藏:0      [点我收藏+]

标签:client   处理   self   实例   handler   ges   服务器端   相关   精简   

技术分享 利用select监听终端操作实例
技术分享 利用select实现伪同时处理多个Socket客户端请求:服务端
技术分享 利用select实现伪同时处理多个Socket客户端请求:客户端

此处的Socket服务端相比与原生的Socket,他支持当某一个请求不再发送数据时,服务器端不会等待而是可以去处理其他请求的数据。但是,如果每个请求的耗时比较长时,select版本的服务器端也无法完成同时操作。

技术分享 基于select实现socket服务端(python2)
技术分享 python3实现

 

SocketServer模块

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

技术分享

ThreadingTCPServer

ThreadingTCPServer实现的Soket服务器内部会为每个client创建一个 “线程”,该线程用来和客户端进行交互。

1、ThreadingTCPServer基础

使用ThreadingTCPServer:

  • 创建一个继承自 SocketServer.BaseRequestHandler 的类
  • 类中必须定义一个名称为 handle 的方法
  • 启动ThreadingTCPServer
技术分享 SocketServer实现服务器
技术分享 客户端

2、ThreadingTCPServer源码剖析

ThreadingTCPServer的类图关系如下:

技术分享 

内部调用流程为:

  • 启动服务端程序
  • 执行 TCPServer.__init__ 方法,创建服务端Socket对象并绑定 IP 和 端口
  • 执行 BaseServer.__init__ 方法,将自定义的继承自SocketServer.BaseRequestHandler 的类 MyRequestHandle赋值给 self.RequestHandlerClass
  • 执行 BaseServer.server_forever 方法,While 循环一直监听是否有客户端请求到达 ...
  • 当客户端连接到达服务器
  • 执行 ThreadingMixIn.process_request 方法,创建一个 “线程” 用来处理请求
  • 执行 ThreadingMixIn.process_request_thread 方法
  • 执行 BaseServer.finish_request 方法,执行 self.RequestHandlerClass()  即:执行 自定义 MyRequestHandler 的构造方法(自动调用基类BaseRequestHandler的构造方法,在该构造方法中又会调用 MyRequestHandler的handle方法)

ThreadingTCPServer相关源码:

技术分享 BaseServer
技术分享 TCPServer
技术分享 ThreadingMixIn
技术分享 ThreadingTCPServer

RequestHandler相关源码

技术分享 SocketServer.BaseRequestHandler

实例:

技术分享 服务端
技术分享 客户端

源码精简:

技术分享 View Code

如精简代码可以看出,SocketServer的ThreadingTCPServer之所以可以同时处理请求得益于select 和 Threading 两个东西,其实本质上就是在服务器端为每一个客户端创建一个线程,当前线程用来处理对应客户端的请求,所以,可以支持同时n个客户端链接(长连接)。

python——网络编程

标签:client   处理   self   实例   handler   ges   服务器端   相关   精简   

原文地址:http://www.cnblogs.com/yechanglv/p/6935599.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!