3

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_box です。目標は、リクエストが行われるたびにそのオブジェクトのメソッドを呼び出すことです。これを行う方法はありますか、それとも別のアプローチを使用する必要がありますか?

ここに同様の質問があることに気付きましたが、提案された解決策はまったく機能しません。実際、私にはあまり意味がありません...

4

1 に答える 1

1

これは少し醜いかもしれませんが、それは私が持っている最良のアイデアです:

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)

ご覧のとおり、アイデアには2つの部分があります。

  1. ハンドラークラスに、そのメソッドからアクセスされるクラス属性を持たせます。
  2. このクラスのサブクラスを作成します。ここで、上記の属性が必要な値(この場合はplayer_boxオブジェクト)に設定されます。

これがお役に立てば幸いです。

于 2012-10-14T12:24:54.997 に答える