我该如何使用Twisted监听多个UDP端口?

5
我已经使用Python和Twisted库编写了一个通过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个监听器-这是一个漫长的故事)。你有没有关于如何实现这个目标的想法?


你可以传递多个处理程序实例而不是同一个实例。 - jfs
1
Rakis已经回答了你的问题,但这也是Twisted中的一个错误 - 即使它是一个错误,你也不应该得到这样一个无用的错误信息(而且你永远不应该看到断言错误)。请在http://twistedmatrix.com/上报告一个错误。 - Glyph
1个回答

7
每次调用listenUDP()都需要一个唯一的处理程序实例。除此之外,你的代码看起来很好。

1
就是这样。 感谢您的帮助。 我现在可以让我的18个端口处于活动侦听状态了。 - Cubs Fan Ron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接