使用python';s SocketServer和子系统
我正在实现一个python应用程序,它使用使用python';s SocketServer和子系统,python,sockets,Python,Sockets,我正在实现一个python应用程序,它使用threadingcpserver和BaseRequestHandler的自定义子类。问题是threadingcpserver似乎会自动生成线程并创建处理程序的实例,调用它们的handle()函数。然而,这使得我除了使用全局变量或类变量之外,无法将数据传递给处理程序,这两种方法看起来都很粗糙。有没有更好的办法 理想情况下,这应该是: class ThreadedTCPServer(ThreadingTCPServer): def process_
threadingcpserver
和BaseRequestHandler
的自定义子类。问题是threadingcpserver
似乎会自动生成线程并创建处理程序的实例,调用它们的handle()
函数。然而,这使得我除了使用全局变量或类变量之外,无法将数据传递给处理程序,这两种方法看起来都很粗糙。有没有更好的办法
理想情况下,这应该是:
class ThreadedTCPServer(ThreadingTCPServer):
def process_request(self, *args, **kwargs):
ThreadingTCPServer.process_request(self, data, *args, **kwargs)
像处理程序一样
class ThreadedTCPRequestHandler(BaseRequestHandler):
def handle(self,data):
#do something with data
由于
handle
是由BaseRequest
子类实现的,因此它可以从自身获取数据,而无需调用方传递数据。(handle
也可以是请求实例的可调用属性,例如lambda explicituser\u data
参数在惯用设计的python中通常是不必要的。)
查看SocketServer代码,可以直接覆盖
finish\u请求
,将附加数据传递给BaseRequestHandler
子类型构造函数,该构造函数将其存储在实例中供句柄
使用。我偶然发现了同样的事情。我的解决办法如下:
class ThreadedTCPRequestHandler(SocketServer.StreamRequestHandler):
def handle(self):
print(self.server.mycustomdata)
class ThreadedTCPServer(SocketServer.ThreadingTCPServer):
pass
server = ThreadedTCPServer((args.host, args.port), ThreadedTCPRequestHandler)
server.mycustomdata = 'foo.bar.z'
server.serve_forever()
RequestHandler将使用服务器对象作为第三个参数进行调用,并将其保存为self.server
属性,以便您可以访问它。如果将此属性设置为callable,也可以轻松调用它:
def handle(self):
mycustomdata = self.server.mycustomdata()
第一个答案对我有效,但我认为更改
\uuuuu init\uuuuu
方法并在构造函数中传递属性更为简洁:
class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
def __init__(self, host_port_tuple, streamhandler, Controllers):
super().__init__(host_port_tuple, streamhandler)
self.Controllers = Controllers
server = ServerInterface.ThreadedTCPServer((HOST, PORT), ServerInterface.ThreadedTCPRequestHandler, Controllers)
请注意构造函数中的第三个参数“Controllers”,然后在没有该参数的情况下调用super,然后将新属性Controllers设置为属性self.Controllers。班上的其余部分没有变化。然后,在Requesthandler中,您可以使用“服务器”属性访问参数,如上所述:
def handle(self):
self.Controllers = self.server.Controllers
<rest of your code>
+1,今天又遇到了这个问题,这对我很有效!