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
。感谢您花时间解释。感谢您花时间解释。