Python SocketServer - 子类化BaseRequestHandler的目的

时间:2014-01-09 22:37:56

标签: python

我是Python的新手,我正在上一些在线安全课程。我必须承认,课程的整个概念还不是很清楚,所以这可能就是我没有完全理解这个概念的原因。他们在python.org网站上说:

  

创建服务器需要几个步骤。首先,你必须创建一个   通过继承BaseRequestHandler类和请求处理程序类   覆盖其handle()方法;这个方法将处理传入   要求。其次,您必须实例化其中一个服务器类,   传递服务器的地址和请求处理程序类。

有人可以更好地解释这个吗?你为什么要创建一个子类?从理论的角度来看,我可以理解使用类的强大功能,我还没有在我的测试脚本中使用它们,但是还没有达到这个目标。#ha;#ha;"时刻。这是我正在学习的课程的脚本:

#!/usr/bin/python
import SocketServer

class EchoHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        print "Got Connection from : ", self.client_address
        data = 'dummy'

        while len(data):
            data = self.request.recv(1024)
            print "Client sent: " + data
            self.request.send(data)
        print "client left"

serverAddr = ("0.0.0.0", 9000)

server = SocketServer.TCPServer(serverAddr, EchoHandler)
server.serve_forever()

2 个答案:

答案 0 :(得分:1)

SocketServer.BaseRequestHandler是处理引擎盖下处理的模板。但它实际上并没有对请求做任何事情。

子类化允许您在该模板上构建,仅添加特定于您的实现的部分,但仍保留基础的所有功能。您可以定义def handle(self)并对所需数据进行特定处理。

答案 1 :(得分:1)

BaseRequestHandler处理您的服务器请求。为了获得对这个类的访问,你需要创建一个子类,它(通过作为一个子类)将允许你访问你需要访问的BaseRequestHandler的各种方法来处理请求在你的服务器上。看一下BaseRequestHandlerfrom the source,并注意handle方法只有pass,因此它没有做任何事情(

}

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 handle(self):
        pass

    ...

您的代码需要使handle方法执行某些操作,并通过创建BaseRequestHandler的子类来实现。