2012-07-09 125 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