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