在Python中将参数传递给UDP处理程序

在Python中将参数传递给UDP处理程序,python,sockets,arguments,handler,Python,Sockets,Arguments,Handler,我第一次在Python中使用套接字,我遇到了一个问题 我的UDP服务器有一个线程化的请求处理程序,但由于它的工作方式(如建议的那样),我不知道如何向它传递参数。我需要它来访问应用程序中的其他对象,因为它必须通知它们网络中不同客户端执行的操作。但是,无法实例化表示处理程序的类,因此无法通过构造函数获取参数 这是我的代码的简化版本 class ThreadedUDPRequestHandler(socketserver.BaseRequestHandler): def

我第一次在Python中使用套接字,我遇到了一个问题

我的UDP服务器有一个线程化的请求处理程序,但由于它的工作方式(如建议的那样),我不知道如何向它传递参数。我需要它来访问应用程序中的其他对象,因为它必须通知它们网络中不同客户端执行的操作。但是,无法实例化表示处理程序的类,因此无法通过构造函数获取参数

这是我的代码的简化版本

class ThreadedUDPRequestHandler(socketserver.BaseRequestHandler):          

    def handle(self):
        data = self.request[0].strip()        
        socket = self.request[1]
        print ("{} wrote:".format(self.client_address[0]))
        print (data)
       #Ideally, I'd call a method of an object here


class ThreadedUDPServer(socketserver.ThreadingMixIn, socketserver.UDPServer):
    pass


class ServerManager():

    def __init__(self, player_box):
        self.player_box = player_box
        HOST, PORT = "xxx.xxx.xxx.xxx", 9999
        self.server = ThreadedUDPServer((HOST, PORT), ThreadedUDPRequestHandler)
        ip, port = self.server.server_address

    def start(self):             
        server_thread = threading.Thread(target=self.server.serve_forever)
        server_thread.start()

    def stop(self):
        self.server.shutdown()
在本例中,我希望请求处理程序访问的对象是player\u box。目标是在每次发出请求时调用该对象的方法。有没有办法做到这一点,或者我应该使用不同的方法


我注意到有一个类似的问题,但提议的解决方案对我来说根本不起作用。事实上,这对我来说没有多大意义…

这可能有点难看,但这是我最好的想法:

class ThreadedUDPRequestHandler(socketserver.BaseRequestHandler):
    PLAYER_BOX = None
    def handle(self):
       data = self.request[0].strip()        
       # (...)
       self.PLAYER_BOX.foo()

class ServerManager():

    def __init__(self, player_box):
        class ThreadedUDPRequestHandlerWithPlayerBox(ThreadedUDPRequestHandler):
            PLAYER_BOX = player_box
        HOST, PORT = "xxx.xxx.xxx.xxx", 9999
        self.server = ThreadedUDPServer((HOST, PORT), ThreadedUDPRequestHandlerWithPlayerBox)
正如你所见,这个想法有两个部分:

  • 让您的处理程序类具有将从其方法访问的类属性
  • 创建这个类的子类,其中上面的属性将被设置为想要的值(在您的例子中,是player\u box对象)

  • 我希望这有帮助。

    已经有了socketserver。ThreadedUDPServer@J.F.塞巴斯蒂安:我提供的链接中建议了这种结构。但是,我认为您可能指的是ThreadingUpServer,尽管我忽略了两者之间是否存在差异。是的,这是一个输入错误:
    s/ed/ing/
    。看,这不是个坏主意。然而,编译器抱怨PLAYER_BOX没有方法foo,因为它的类型是None,我认为这需要更难看的方法才能正确。不管怎样,在绝望的边缘,我把自己投入了扭曲者的怀抱。我发现ServerSocket框架中的线程有点奇怪。谢谢你的建议。我从来没有用过Twisted,但它看起来很不错。如果您最终选择使用上述方法,则可以使用
    如果self.PLAYER\u BOX不是None:self.PLAYER\u BOX.foo()
    ,以避免潜在问题。祝你好运