zoukankan      html  css  js  c++  java
  • python——网络编程

     利用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个客户端链接(长连接)。

  • 相关阅读:
    【NOIP2016练习】T3 subset (分块,状压DP)
    【CF173B】Chamber of Secrets(二分图,最短路)
    【CF721C】Journey(拓扑排序,最短路,DP)
    【BZOJ1040】骑士(基环树,树形DP)
    【CF725D】Contest Balloons(贪心,堆)
    【CF675E】Trains and Statistic(贪心,DP,线段树优化)
    【HDOJ2196】Computer(树的直径,树形DP)
    js继承
    原型模式
    创建对象
  • 原文地址:https://www.cnblogs.com/yechanglv/p/6935599.html
Copyright © 2011-2022 走看看