Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python';s SocketServer和子系统_Python_Sockets - Fatal编程技术网

使用python';s SocketServer和子系统

使用python';s SocketServer和子系统,python,sockets,Python,Sockets,我正在实现一个python应用程序,它使用threadingcpserver和BaseRequestHandler的自定义子类。问题是threadingcpserver似乎会自动生成线程并创建处理程序的实例,调用它们的handle()函数。然而,这使得我除了使用全局变量或类变量之外,无法将数据传递给处理程序,这两种方法看起来都很粗糙。有没有更好的办法 理想情况下,这应该是: class ThreadedTCPServer(ThreadingTCPServer): def process_

我正在实现一个python应用程序,它使用
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 explicit
user\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,今天又遇到了这个问题,这对我很有效!