Как отключить мой клиентский объект XMPPPY

Подключиться к XMPP-серверу с помощью XMPPPY просто.

from xmpp.client import Client as XMPPClient

self.xmppClient = XMPPClient("jabber.foo.com")
if not self.xmppClient.connect(server="localhost"):
    raise IOError('Cannot connect to server.')
if not self.xmppClient.auth("node", "password", "resource"):
    raise IOError('Can not auth with server.')
    self.xmppClient.RegisterHandler("message", self.messageHandler)
self.xmppClient.sendInitPresence()

Тем не менее, бывают случаи, когда мой клиент вынужден отключаться, и все же продолжать заниматься другими делами. Я хотел бы убедиться, что клиент отключается правильно - сокет не "болтается" и ресурсы сервера не расходуются впустую.

Является ли предполагаемый шаблон просто установить для клиента значение None и позволить GC очистить объект?

self.xmppClient = None

Я вижу "отключенные обработчики" в клиенте, но не вижу, как их вызывать. И документация, которая идет с XMPPPY, ужасна.

У кого-нибудь есть хоть какой-то ключ к "правильному способу" отключения?

2 ответа

Вообще говоря, если вы хотите отключиться от сервера XMPP, вы отправите раздел присутствия с type='unavailable', как показано ниже:

<presence type='unavailable' />

Обратите внимание, что Присутствие НЕ имеет адрес получателя. Вот ссылка на RFC XMPP на тот случай, если вы хотите узнать больше. (Раздел 5.1.5)

После этого вы можете изящно отключиться от сервера, поскольку присланное вами сообщение в основном говорит серверу: "Я отсутствует".

Я взглянул на документацию XMPPPY (да, я согласен, что в ней есть возможности для улучшения), и кажется, что xmpp.Client.Client содержит вызов функции sendPresence (...). Возможно, вы сможете отправить недоступное присутствие с помощью функции?

Вот документация по API: http://xmpppy.sourceforge.net/apidocs/xmpp.client.Client-class.html

xmpp.dispatcher.Dispatcher класс имеет disconnect() метод. Это не очевидно из автоматически сгенерированной документации, поскольку она загружается динамически через PlugIn механизм, но вы можете использовать его на любом CommentClient объект.

Другие вопросы по тегам