zoukankan      html  css  js  c++  java
  • socketserver模块

    socketserver

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

    ThradingTCPServer

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

    1,ThradingTCPServer 基础

    使用ThradingTCPServer:

    • 创建一个继承 socketserver.BaseRequestHandler 的类
    • 类中必须定义一个名we诶handle 的方法
    • 启动 ThradingTCPServer

    代码:

    复制代码
    #!/usr/bin/env python3
    import socketserver
    
    class Server(socketserver.BaseRequestHandler):    #$ 必须继承BaseRequestHandler
        def handle(self):        #$ 必须有handle方法
            print('New connection:',self.client_address)
            while True:
                data = self.request.recv(1024)
                if not data:break    
                print('Client data:',data.decode())
                self.request.send(data)    
    
    if __name__ == '__main__':
        server = socketserver.ThreadingTCPServer(('127.0.0.1',8009),MyServer)    #$ 实现多线程的socket
        server.serve_forever()    #$ 当前连接断开不会出现关闭或报错,可以与其他客户端继续连接
    复制代码

    client端:

    复制代码
    import socket
    ip_port = ('127.0.0.1',8080)
    sk = socket.socket()
    sk.connect(ip_port)
    
    while True:
        raw = input('>> ').strip()
        sk.send(bytes(raw,'utf8'))
        msg = sk.recv(1024)
        print(str(msg,'utf8'))
    sk.close()
    复制代码

    2,ThradingTCPServer源码剖析

    内部调用流程为:

    • 启动服务端程序
    • 执行 TCPServer.__init__方法,创建服务端socket对象并绑定IP和端口
    • 执行 BaseServeer.__init__方法,将自定义的继承自socketserver.BaseRequestHandler 的类 MyRequestHandle赋值给 self.RequestHandlerClass
    • 执行BaseServer.server_forever 方法,while 循环一直监听是否有客户端请求到达
    • 当客户端连接到达服务器
    • 执行ThreadingMixIn.proceess_request 方法,创建一个“线程”用来处理请求
    • 执行 ThreadingMixIn.proceess_request _thread 方法
    • 执行 BaseServer.finish_request 方法,执行 self.RequseetHandlerClass() 即:执行 自定义 MyRequestHandler 的构造方法(自动调用基类 BaseRequestHandler的构造方法,在该构造方法中又会调用MyRequestHandler的handle方法)
  • 相关阅读:
    redis sentinel搭建以及在jedis中使用
    redis入门指南书中概要
    mysql crash cource 书中实例
    图片服务器域名选择
    自行实现一个简易RPC框架
    webservice基础
    maven实战
    类似◇形的图形,四边都是对应的行数的数字。
    C 中随机数
    给特定的寄存器赋值,读特定的寄存器
  • 原文地址:https://www.cnblogs.com/wangmo/p/7792605.html
Copyright © 2011-2022 走看看