2012-10-13 145 views
2

我在Python中第一次使用套接字,並且遇到問題。將參數傳遞給Python中的UDP處理程序

我有一個線程的請求處理程序爲我的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,但提出的解決方案根本不適用於我。事實上,它並沒有多大意義,我...

+0

已經有socketserver.ThreadedUDPServer – jfs

+0

@ J.F。塞巴斯蒂安這個結構是在我提供的鏈接中提出的。不過,我認爲你可能指的是ThreadingUDPServer,儘管我忽略了兩者之間是否應該有區別。 – broncoAbierto

+0

是的,這是一個錯字:'s/ed/ing /'。參見[source](http://hg.python.org/cpython/file/default/Lib/socketserver.py#l627) – jfs

回答

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) 

正如你所看到的,這個想法有兩個部分:

  1. 讓您的處理程序類具有可從其方法訪問的類屬性。
  2. 創建這個類的子類,其中上面的屬性將被設置爲想要的值(在你的情況下,player_box對象)。

我希望這會有所幫助。

+0

這不是一個壞主意。然而,編譯器抱怨PLAYER_BOX沒有foo方法,因爲它是None類型的,而且我認爲要做出正確的選擇會更加醜陋。無論如何,在絕望的邊緣,我把自己投入Twisted的懷抱。我發現ServerSocket框架中的線程有點奇怪。感謝您的建議。 – broncoAbierto

+0

我從來沒有使用扭曲,但它看起來非常好。如果你確實選擇使用上面的方法,你可以使用'if self.PLAYER_BOX不是None:self.PLAYER_BOX.foo()'來避免潛在的問題。祝你好運! –

相關問題