2010-09-30 39 views
3

连接到具有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() 

但是,有时候我的客户必须强制断开连接,但仍然继续做其他事情。我想确保客户端正确断开 - 套接字不是“闲置”的,服务器资源不会被浪费。

是预期模式给客户只需设置为无,让GC清理对象?

self.xmppClient = None 

我在客户端看到“断开的处理程序”,但我看不到如何调用它们。 XMPPPY附带的文档非常糟糕。

任何人有任何的“正道”任何线索断开?

回答

0

一般来说,如果你想从一个XMPP服务器断开连接,您会送一个应答stanze类型=“不可用”,如下所示:

<presence type='unavailable' /> 

注意,存在不具有收件人地址。如果您想了解更多信息,以下是XMPP RFC的link。 (5.1.5节)

之后,你可以优雅地从服务器断开,因为你基本上发送的存在告诉服务器,“我走了。”

我接过一看XMPPPY文档(是的,我同意,它有改进的余地),似乎xmpp.Client.Client包含一个函数调用sendPresence(...)。您可能能够使用该功能发送不可用的状态?

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

+0

你绝对可以发送一个无法存在,而我这样做。但是,这并不会断开你的客户端(和套接字),正如你所暗示的那样。你确实需要从服务器端正常断开,这是我真正的问题。我会期望一个推论xmpp.Client.Client.connect()(如disconnect()?),但没有一个。 – 2010-10-01 15:01:41

+0

@大卫 - 对不起,我误解了你的问题。不幸的是,我不熟悉XMPPY客户端。我做了一些Google,这是我为断开连接方法发现的最接近的东西:http://xmpppy.sourceforge.net/examples/xsend.py在脚本中,作者特意注释掉了一个client.disconnect()呼叫。此外,如果你看看这个库的基本教程(http://xmpppy.sourceforge.net/basic.html),作者指出它只是离开了Python和TCP/IP层的连接......它是一个“ as-design“,库的作者不提供断开连接方法? – DashK 2010-10-01 18:01:46

0

xmpp.dispatcher.Dispatcher类有一个disconnect()方法。因为它是通过PlugIn机制动态加载这不是显而易见的自动生成的文档,但你可以使用任何CommentClient对象。

+0

disconnect()方法实际上不会断开套接字。如果你看看代码,它只是发送一个“结束流”。然后,我认为,通过其他方式,调用客户端断开连接处理程序。 – 2010-12-24 16:22:16

+0

正是。客户端发送一个流结束标记,然后处理所有传入节。当它从服务器收到流结束标记时,会调用'stream_footer_received'处理程序。这个处理程序调用'session._stream_close()',这实际上会破坏套接字。所以我想干净的方法是调用'disconnect()'并让连锁反应发生。 – 2011-01-02 05:51:17