书上代码如下:
from socketserver import TCPServer,StreamRequestHandler
class Handler(StreamRequestHandler):
def handle(self):
print(type(self.request))
addr = self.request.getpeername()
print('Got connection from ',addr)
self.wfile.write(b'thank you for connecting...')
server = TCPServer(('li-linfeng1',1234),Handler)
server.serve_forever()
我的问题是,Handler中的self.request为什么是一个socket对象呢?
self.request所在的类BaseRequestHandler源代码如下,从源代码中也看不出self.request是socket对象,求问是怎么知道这个self.request是socket对象,从而可以调用getpeername()方法的呢?
class BaseRequestHandler:
"""Base class for request handler classes.
This class is instantiated for each request to be handled. The
constructor sets the instance variables request, client_address
and server, and then calls the handle() method. To implement a
specific service, all you need to do is to derive a class which
defines a handle() method.
The handle() method can find the request as self.request, the
client address as self.client_address, and the server (in case it
needs access to per-server information) as self.server. Since a
separate instance is created for each request, the handle() method
can define arbitrary other instance variariables.
"""
def __init__(self, request, client_address, server):
self.request = request
self.client_address = client_address
self.server = server
self.setup()
try:
self.handle()
finally:
self.finish()
def setup(self):
pass
def handle(self):
pass
def finish(self):
pass
用的Python3.5?
繼承關係是
也就是BaseRequestHandler是最上面的父類,而處理邏輯由TCPServer也就是BaseServer執行。
其主要處理邏輯位於socketserver.py裡的serve_forever函數,
你再看下_handle_request_noblock,這裡面