2012-07-09 121 views
5

我已經使用Python和Twisted庫通過UDP進行通信編寫了一個服務器。這一切運作良好。如何使用扭曲來偵聽多個udp端口?

我想要做的是擴展該服務器,以便它可以同時接受多個UDP端口上的消息(我使用不同的端口來隔離返回的信息,而不是關於請求的來源)。我試着先做簡單的事情作爲一個測試 - 我寫的代碼看起來像這樣:

reactor.listenUDP(port, handler) 
reactor.listenUDP(port+1, handler) 

(第一行是一個原本在我的服務器;第二行是第二個端口監聽到)

當我跑,我得到如下:

File "./rspServer.py", line 838, in mainLoop 
    reactor.listenUDP(self.args.port+1, udpHandler) 
File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/twisted/internet/posixbase.py", line 347, in listenUDP 
    p.startListening() 
File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/twisted/internet/udp.py", line 86, in startListening 
    self._connectToProtocol() 
File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/twisted/internet/udp.py", line 106, in _connectToProtocol 
    self.protocol.makeConnection(self) 
File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/twisted/internet/protocol.py", line 665, in makeConnection 
    assert self.transport == None 
AssertionError 

我從這個我不能添加第二個UDP監聽,但是這正是我想要做什麼(實際上,總共需要18個聽衆 - 這是一個很長的故事)。有關如何做到這一點的任何想法?

+0

您可以傳遞多個處理程序實例而不是同一個 – jfs 2012-07-09 14:32:08

+1

Rakis已經爲您的問題留下了正確的答案,但這也是Twisted中的一個錯誤 - 即使它是一個錯誤,您也不應該得到如此無用的錯誤消息(你永遠不應該看到一個斷言錯誤,句點)。請在http://twistedmatrix.com/ – Glyph 2012-07-09 18:34:55

回答

7

每個對listenUDP()的調用都需要一個唯一的處理程序實例。除此之外,你的代碼看起來很好。

+1

提交錯誤。就是這樣。謝謝您的幫助。我現在能夠積極傾聽我的18個端口。 – 2012-07-10 12:00:38