listenTCP
возвращает IListeningPort
, который имеет метод getHost()
, который возвращает объект с port
. Например:
>>> from twisted.internet import reactor
>>> from twisted.internet.protocol import Factory
>>> port = reactor.listenTCP(0, Factory())
>>> port.getHost().port
55791
Тем не менее, TCPServer
не вызывает listenTCP
, пока не будет запущено с privilegedStartService
. Кроме того, IListeningPort
на самом деле не доступен через публичный API. Итак, вам нужно написать свой Service
. К счастью, это довольно легко сделать; TCPServer
не очень много делает. Вам просто нужно написать тот, который сообщит свой порт куда-нибудь, как только он начнет слушать. Вот пример:
from twisted.internet import reactor
from twisted.application.service import Service
class PortReporter(Service, object):
def __init__(self, factory, reportPort):
self.factory = factory
self.reportPort = reportPort
def privilegedStartService(self):
self.listeningPort = reactor.listenTCP(0, self.factory)
self.reportPort(self.listeningPort.getHost().port)
return super(PortReporter, self).privilegedStartService()
def stopService(self):
self.listeningPort.stopListening()
return super(PortReporter, self).stopService()
Затем вы можете использовать это в файле TAC, например:
from twisted.internet.protocol import Factory
from twisted.application.service import Application
application = Application("test")
def showPortNumber(n):
print("The port number is: %d" % (n,))
PortReporter(Factory(), showPortNumber).setServiceParent(application)