Python:setup()与socketserver';s处理程序类

Python:setup()与socketserver';s处理程序类,python,sockets,socketserver,Python,Sockets,Socketserver,我正在尝试为socketserver定义一个处理程序类。当处理程序类没有定义\uuuu init\uuuu()方法时,我的服务器工作了。客户端发送的消息已写入输出窗口。然而,当我添加了一个\uuu init\uuu()方法来声明一个类成员时,我的程序抛出了一个异常,因为RequestHandlerClass只需要一个参数,而我向它传递了四个参数。在把头撞到砖墙上一段时间后,我记得BaseRequestHandler类有一个可重写的setup()方法。我为它声明了一个覆盖,并在其中声明了我的类成员

我正在尝试为
socketserver
定义一个处理程序类。当处理程序类没有定义
\uuuu init\uuuu()
方法时,我的服务器工作了。客户端发送的消息已写入输出窗口。然而,当我添加了一个
\uuu init\uuu()
方法来声明一个类成员时,我的程序抛出了一个异常,因为
RequestHandlerClass
只需要一个参数,而我向它传递了四个参数。在把头撞到砖墙上一段时间后,我记得
BaseRequestHandler
类有一个可重写的
setup()
方法。我为它声明了一个覆盖,并在其中声明了我的类成员,它成功了

虽然我有解决眼前问题的办法,但我想了解这一点。我是否永远都不应该在请求处理程序类中声明自己的
\uuuu init\uuuu()
方法?或者如果我应该,应该如何声明

这是我的密码:

import socketserver
import logging
import logging.config
import json
from TWMSMessageHandler import TWMSMessageHandler

class SingleTCPHandler(socketserver.BaseRequestHandler):
    # def __init__(self):   ## causes an error 
    def setup(self):
        self.messageHandler = TWMSMessageHandler()

    # One instance per connection.  Override handle(self) to customize action.
    def handle(self):
        # self.request is the client connection
        data = self.request.recv(1024)  # clip input at 1Kb

        dataString = data.decode()
        print ("Received data: " + dataString)
        self.request.close()

class MyTCPServer(socketserver.TCPServer):

    def __init__(self, serverAddress, handler):
        super().__init__(serverAddress, handler)

    def handle_timeout(self):
        print ("No message received in {0} seconds".format(self.timeout))

if __name__ == "__main__":
    with open('TWMSHandler_log_config.json', 'rt') as f:
        config = json.load(f)
    logging.config.dictConfig(config)

    tcpServer = MyTCPServer(("127.0.0.1", 5006), SingleTCPHandler)
    tcpServer.timeout = 30

    loopCount = 0
    while loopCount < 5:
        try:
            print ("About to wait for request")
            tcpServer.handle_request()
            print ("Back from handle_request")
            loopCount = loopCount + 1
        except Exception as Value:
            print ("Oops!  " + str(Value))
            break
导入socketserver
导入日志记录
导入logging.config
导入json
从TWMSMessageHandler导入TWMSMessageHandler
类SingleTCPHandler(socketserver.BaseRequestHandler):
#定义初始化(self):##导致错误
def设置(自):
self.messageHandler=TWMSMessageHandler()
#每个连接一个实例。重写句柄(自)以自定义操作。
def句柄(自身):
#self.request是客户端连接
data=self.request.recv(1024)#以1Kb的速度剪辑输入
dataString=data.decode()
打印(“收到的数据:”+dataString)
self.request.close()
类MyTCPServer(socketserver.TCPServer):
def uuu init uuu(self、serverAddress、handler):
super()
def句柄_超时(自身):
打印(“在{0}秒内未收到任何消息”。格式(self.timeout))
如果名称=“\uuuuu main\uuuuuuuu”:
将open('TWMSHandler\u log\u config.json','rt')作为f:
config=json.load(f)
logging.config.dictConfig(config)
tcpServer=MyTCPServer(((“127.0.0.1”,5006),SingleTCPHandler)
tcpServer.timeout=30
循环计数=0
当循环计数小于5时:
尝试:
打印(“即将等待请求”)
tcpServer.handle_请求()
打印(“从句柄请求返回”)
loopCount=loopCount+1
除异常值外:
打印(“Oops!”+str(值))
打破

我假设Python2.7,因为您没有另外指定,所以这应该也适用于Python3.x

如果您查看一下源代码(),您要覆盖的BaseRequestHandler类除了使用
self
之外,还使用了3个参数:
request、client\u address、server
。如果要覆盖
\uuuuu init\uuuuu
,则必须与此签名兼容,除非还覆盖了从TCPServer继承链中调用
\uuuuuuuu init\uuuuuu
的调用站点(您不希望这样做)


由于该函数所做的只是保存状态,否则您必须保存自己(或通过
super
调用调用基函数),因此您也可以按原样使用
setup

我假设python 2.7,因为您没有另外指定,这也应该适用于python 3.x

如果您查看一下源代码(),您要覆盖的BaseRequestHandler类除了使用
self
之外,还使用了3个参数:
request、client\u address、server
。如果要覆盖
\uuuuu init\uuuuu
,则必须与此签名兼容,除非还覆盖了从TCPServer继承链中调用
\uuuuuuuu init\uuuuuu
的调用站点(您不希望这样做)


由于该函数所做的只是保存状态,否则您将不得不保存自己(或通过
super
调用基本函数),因此您可以直接使用
setup

感谢您花时间解释。感谢您花时间解释。