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

原文地址:https://www.cnblogs.com/YiYA-blog/p/10147950.html