• python_day27__socketserver模块_多人和一个人聊天_重新理了一下代码(类)执行的思路


    #Author:'haijing'
    #date:2018/11/15
    #socket的方法比如bind方法、listen方法、都被封装在socketserver中
    #具体怎么去接收和发送都在类中的handle方法中自己去定义
    #listen方法在socketserver中默认为5个

    import socketserver

    class MyServer(socketserver.BaseRequestHandler): #定义一个类MyServer(类名可随意),并继承socketserver.BaseRequestHandler这个类
    def handle(self): #必须叫hanlde,因为在socketserver模块下BaseRequestHandler类下有handle方法,现在重写这个方法
    print ("服务端启动...")
    while True:
    conn = self.request #等价于conn, addr = sk.accept()
    print (self.client_address) #
    while True:
    client_data=conn.recv(1024) #收
    print (str(client_data,"utf8"))
    print ("waiting...")
    server_response = input('>>>')
    conn.sendall(bytes(server_response,'utf8')) #发 原数发回去
    conn.close()

    if __name__ == '__main__':
    server = socketserver.ThreadingTCPServer(('127.0.0.1',8091),MyServer) #真正代码从这里开始执行
    server.serve_forever() #启动,执行handle方法

    # server = socketserver.ThreadingTCPServer(('127.0.0.1',8091),MyServer)的执行步骤
    #在代码真正开始执行的那一句开始,socketserver.ThreadingTCPServer(('127.0.0.1',8091),MyServer)
    #ctrl+点击ThreadingTCPServer去这个方法下去找有没有__init__方法
    #ctrl+点击ThreadingTCPServer,后进去发现只有class ThreadingTCPServer(ThreadingMixIn, TCPServer): pass
    #没有__init__方法,那么再去ThreadingTCPServer继承的类ThreadingMixIn中去找有没有__init__方法
    #ctrl+点击ThreadingMixIn,后进去发现没有__init__方法,那么再去ThreadingTCPServer继承的另一个类TCPServer中去找
    #ctrl+点击TCPServer,后进去发现是有__init__方法,在这个__init__方法下又有BaseServer.__init__方法,那么再ctrl+BaseServer
    #去查看BaseServer下的__init__方法执行的代码,将('127.0.0.1',8091)赋给了self.server_address
    #将Myserver赋给了self.RequestHandlerClass,执行完BaseServer下的__init__方法下的代码之后
    # 再去执行TCPServer下的__init__方法代码
    #执行完了之后便完成了连接



    #再去执行server.serve_forever(),ctrl+serve_forever查看有没有__init__方法,没有,也没继承,那么去执行
    #serve_forever下的代码,重点看try下的代码,其余的都是做准备的,中有if ready:self._handle_request_noblock()
    #那么ctrl+点击_handle_request_noblock(),去看_handle_request_noblock()执行的是什么,进去之后发现在第二个try中有process_request
    #那么ctrl+点击process_request,去看process_request执行的是什么,进去之后发现self.finish_request还是不知道什么意思
    #那么ctrl+点击finish_request,去看finish_request执行的是什么,进去之后发现self.RequestHandlerClass,差不多该知道了,如果不清楚继续
    # ctrl+点击self.RequestHandlerClass,进去之后是self.RequestHandlerClass = RequestHandlerClass
    #而RequestHandlerClass就是我们传进去以上自己创建的类Myserver,中间是有参数传递的,这里没有细说。
    #那么现在就是执行类Myserver类中的__init__方法,但是Mysrver中没有__init__方法,那么再去Myserver继承的类socketserver.BaseRequestHandler中
    #去找有有没有__init__方法,发现是有的,而且在这个__init__方法下正好执行了handle方法

    2018.12.20 haijing

  • 相关阅读:
    开放不应是唯一的价值观,互联网营销 狼人:
    什么是互联网产品的运营?,互联网营销 狼人:
    十年:邮箱,互联网营销 狼人:
    瘦客户端那些事 开篇,互联网营销 狼人:
    谈谈互动型网站中垃圾贴的应对方案,互联网营销 狼人:
    告诉你一个真实的中国互联网:精英与草根,互联网营销 狼人:
    从Google Wave和XML看软件复杂性之争,互联网营销 狼人:
    构建可伸缩高性能的互联网应用,互联网营销 狼人:
    注册接口使用StructureMap和Autofac等Ioc容器
    备份文件oracle 10g rman备份与恢复 之二
  • 原文地址:https://www.cnblogs.com/YiYA-blog/p/10147950.html
Copyright © 2020-2023  润新知