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

标签 python sockets arguments handler

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

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

这是我的代码的简化版本。

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_box。目标是每次发出请求时调用该对象的方法。有没有办法做到这一点,或者我应该使用不同的方法?

我注意到有一个类似的问题 here ,但建议的解决方案对我来说根本不起作用。其实对我来说意义不大...

最佳答案

这可能有点难看,但这是我最好的主意:

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)

如您所见,这个想法有两个部分:

  1. 让您的处理程序类具有一个类属性,该属性可从其方法访问。
  2. 创建此类的子类,其中上述属性将设置为所需值(在您的情况下为 player_box 对象)。

希望对您有所帮助。

关于python - 在 Python 中将参数传递给 UDP 处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12877185/

相关文章:

python - 是否有一个函数可以比较两个 DataFrame 并输出不同的元素?

java - Java 中的 PrintWriter 或任何其他输出流不知道 "\r\n"

c# - 可扩展的套接字事件队列处理

python - 如何在不更改基类的情况下向类的实例添加行为

python - 上传文件在 Django 中无法正常工作

python - 从 Pandas Dataframe 打印中删除页眉和页脚

c# - 在C#中调用Linux Socket和Epoll函数

python - def myfunction(silent = False, x, y) "silent = False"部分是做什么的?

windows - 通过双击关联文件打开 C++ 程序。我如何获得文件名?

Java - 如何通过快捷方式传递参数