如何断开我的XMPPPY客户端对象连接
用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