Как вызвать Twisted реактор из файла, отличного от его?
У меня есть вопрос, который вполне может принадлежать Twisted или иметь прямое отношение к Python.
Моя проблема, как и другая, связана с процессом отключения в Twisted. Как я читаю на этом сайте, если я хочу, я должен выполнить следующие шаги:
- Сервер должен перестать слушать.
- Клиентское соединение должно отключиться.
- Соединение с сервером должно отключиться.
Согласно тому, что я прочитал на предыдущей странице, чтобы сделать первый шаг, нужно запустить stopListening
метод.
В примере, упомянутом в Интернете, все действия выполняются в одном и том же сценарии. Упрощение доступа к различным переменным и методам.
Для меня у меня есть сервер и клиент в разных файлах и разных местах.
У меня есть функция, которая создает сервер, назначает протокол и хочет, из клиентского протокола в другом файле, сделать вызов AMP для метода для остановки соединителя.
AMP вызова вызывает команду SendMsg.
class TESTServer(protocol.Protocol):
factory = None
sUsername = ""
credProto = None
bGSuser = None
slot = None
"""
Here was uninteresting code.
"""
# upwards=self.bGSuser, forwarded=True, tx_timestamp=iTimestamp,\
# message=sMsg)
log.msg("self.connector")
log.msg(self.connector)
return {'bResult': True}
SendMsg.responder(vSendMsg)
def _testfunction(self):
logger = logging.getLogger('server')
log.startLogging(sys.stdout)
pf = CredAMPServerFactory()
sslContext = ssl.DefaultOpenSSLContextFactory('key/server.pem',\
'key/public.pem',)
self.connector = reactor.listenSSL(1234, pf, contextFactory = sslContext,)
log.msg('Server running...')
reactor.run()
if __name__ == '__main__':
TESTServer()._testfunction()
Класс CredAMPServerFactory назначает соответствующий протокол.
class CredAMPServerFactory(ServerFactory):
"""
Server factory useful for creating L{CredReceiver} and L{SATNETServer} instances.
This factory takes care of associating a L{Portal} with the L{CredReceiver}
instances it creates. If the login is succesfully achieved, a L{SATNETServer}
instance is also created.
"""
protocol = CredReceiver
В классе "CredReceiver" у меня есть вызов, который назначает протокол классу TestServer. Я делаю это, чтобы совершать звонки, используя метод AMP "Ответчик".
self.protocol = SATNETServer
Моя проблема в том, что когда я делаю вызов, программа отвечает с ошибкой, указывающей, что соединитель не принадлежит объекту атрибута CredReceiver.
File "/home/sgongar/Dev/protocol/server_amp.py", line 248, in vSendMsg
log.msg(self.connector)
exceptions.AttributeError: 'CredReceiver' object has no attribute 'connector'
Как я мог это сделать? Кто-нибудь знает подобный пример, который может принять к сведению?
Спасибо.
РЕДАКТИРОВАТЬ.
Сторона сервера:
server_amp.py
Запускает реактор:
reactor.listenSSL(1234, pf, contextFactory = sslContext,)
из класса SATNETServer.Назначает протокол,
pf
, чтобыCredAMPServerFactory
класс, который принадлежит модулю server.py также из класса SATNETServer.
server.py
- В классе
CredAMPServerFactory
правопреемникиCredReceiver
класс к протоколу. - Как только соединение установлено, класс
SATNETServer
назначен протоколу.
Сторона клиента:
client_amp
- Делает звонок в
SendMsg
метод, принадлежащий кSATNETServer
учебный класс.