如何断开我的XMPPPY客户端对象连接

3 投票
2 回答
2364 浏览
提问于 2025-04-16 04:49

用XMPPY连接到XMPP服务器其实很简单。

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,然后让垃圾回收机制来处理这个对象就可以了?

self.xmppClient = None

我在客户端里看到有“断开连接的处理程序”,但是我不知道怎么去调用它们。而且,XMPPY的文档真的是糟糕透了。

有没有人知道“正确的断开连接方法”是什么?

2 个回答

1

xmpp.dispatcher.Dispatcher这个类里面有一个叫做disconnect()的方法。这个方法在自动生成的文档里不太明显,因为它是通过PlugIn机制动态加载的。不过,你可以在任何CommentClient对象上使用这个方法。

1

一般来说,如果你想要断开与XMPP服务器的连接,你需要发送一个状态消息,类型设置为'unavailable',像下面这样:

<presence type='unavailable' />

需要注意的是,这个状态消息是没有接收者地址的。如果你想了解更多,可以查看XMPP的相关文档,这里有个链接。(第5.1.5节)

发送完这个状态消息后,你就可以优雅地断开与服务器的连接,因为你发出的消息基本上是在告诉服务器:“我不在了。”

我查看了一下XMPPY的文档(我同意它还有改进的空间),看起来xmpp.Client.Client里面有一个叫sendPresence(...)的函数。你可能可以通过这个函数发送一个'unavailable'的状态消息?

这是API文档的链接:http://xmpppy.sourceforge.net/apidocs/xmpp.client.Client-class.html#sendPresence

撰写回答