书上代码如下:
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
Using Python3.5?
The inheritance relationship is
That is, BaseRequestHandler is the top parent class, and the processing logic is executed by TCPServer, which is BaseServer.
The main processing logic is located in the serve_forever function in socketserver.py,
Look at _handle_request_noblock again, here