将变量发送到python中的TCPHandler

时间:2013-04-08 21:21:50

标签: python tcp socketserver

我对如何在python中使用SocketServer.TCPServer将变量发送到TCPHandler感到困惑。

HOST, PORT = hosts[0], args.port
server = SocketServer.TCPServer((HOST, PORT), METCPHandler)
server.serve_forever()

哪个电话:

class METCPHandler(SocketServer.BaseRequestHandler):           
    def handle(self):
        self.data = self.request.recv(1024).strip()
        print "{} wrote:".format(self.client_address[0])
        r = MExpressHandler(self.data, False)

但我想将调试布尔值传递给MExpressHandler ..所以

HOST, PORT = hosts[0], args.port
server = SocketServer.TCPServer((HOST, PORT), METCPHandler(debug))
server.serve_forever()

失败。这样做的正确方法是什么?我是否必须重新创建一个完整的TCPHandler over __init__

2 个答案:

答案 0 :(得分:3)

相信你的直觉,正确的方法 确实是TCPServer的子类并覆盖__init__方法,但Python使这很容易!

import SocketServer

class DebugTCPServer(SocketServer.TCPServer):
    def __init__(self, server_address, RequestHandlerClass, bind_and_activate=True, debug=True):
        self.debug = debug
        SocketServer.TCPServer.__init__(self, server_address, RequestHandlerClass, bind_and_activate=True)

class DebugMETCPHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        # self.server is an instance of the DebugTCPServer
        DEBUG = self.server.debug
        self.data = self.request.recv(1024).strip()
        if DEBUG:
            print "{} wrote:".format(self.client_address[0])
        r = MExpressHandler(self.data, False)


server = DebugTCPServer((HOST, PORT), DebugMETCPHandler, debug=True)

或者我们将debug=True指定为默认值:

server = DebugTCPServer((HOST, PORT), DebugMETCPHandler)

答案 1 :(得分:0)

正如我在post已经提出的那样,可以在不对TCPServer进行子类化的情况下进行。事实上它更简洁和通用。

您可以通过以下方式为处理程序提供参数:

class METCPHandler(SocketServer.BaseRequestHandler):
  def __init__(self, debug):
    self.debug = debug

  def __call__(self, request, client_address, server):
    h = METCPHandler(self.debug)
    SocketServer.StreamRequestHandler.__init__(h, request, client_address, server)

您现在可以将处理程序的实例提供给TCPServer:

SocketServer.TCPServer((HOST, PORT), METCPHandler(True))

TCPServer通常会为每个请求创建一个 METCPHandler 的新实例,但在这种情况下,将调用 __ call __ 方法而不是构造函数(它已经是一个实例。 )

调用方法中,我明确地制作了当前METCPHandler的副本,并将其传递给超级构造函数,以符合"每个请求的一个处理程序实例的原始逻辑"

值得一看的是SocketServer模块,以了解这里发生的事情:https://github.com/python/cpython/blob/2.7/Lib/SocketServer.py