2012-04-23 41 views
3

我有一個應用程序將發送xmpp消息。那些場合很罕見(有時甚至幾天都沒有),但是可能會再次出現。我無法接收任何東西,我只想發送。直接的方法會遇到未被發現的超時。最後的send()沒有發生(接收器沒有得到任何東西),但返回時沒有報告問題(返回一個簡單的ID,就好像一切正​​常)。只有下一個調用send()然後引發IOError('斷開與服務器'。)。檢測python-xmpp超時

我可以爲每條消息做一個不斷的斷開連接/重新連接,但我不喜歡這樣做,因爲有時候這會斷開連接並且很頻繁地重新連接(我不知道服務器是否會在一秒鐘內多次欣賞)。

我可以嘗試在this question這裏給出答案,但我並不需要接收XMPP回覆。

問:有沒有一種簡單的方法來之前或發送,但不嘗試發送第二消息(這將垃圾郵件的接收器的情況下,一切工作得很好)後,檢測連接超時

我直截了當的方法:

import xmpp 

def connectXmppClient(fromJidName, password): 
    fromJid = xmpp.protocol.JID(fromJidName) 
    xmppClient = xmpp.Client(fromJid.getDomain(), debug=[]) 
    connection = xmppClient.connect() 
    if not connection: 
    raise Exception("could not setup connection", fromJid) 
    authentication = xmppClient.auth(
    fromJid.getNode(), password, resource=fromJid.getResource()) 
    if not authentication: 
    raise Exception("could not authenticate") 
    return xmppClient 

def sendXmppMessage(xmppClient, toJidName, text): 
    return xmppClient.send(xmpp.protocol.Message(toJidName, text)) 

if __name__ == '__main__': 
    import sys, os, time, getpass 
    if len(sys.argv) < 2: 
    print "Syntax: xsend fromJID toJID" 
    sys.exit(0) 
    fromJidName = sys.argv[1] 
    toJidName = sys.argv[2] 
    password = getpass.getpass() 
    xmppClient = connectXmppClient(fromJidName, password) 
    while True: 
    line = sys.stdin.readline() 
    if not line: 
     break 
    print xmppClient.isConnected() 
    id = sendXmppMessage(xmppClient, toJidName, line) 
    print id 
+0

爲什麼不把'xmppClient.send'放在'try:catch:'中?你可以檢查異常的類型。如果它是'IOError',那麼再次調用你的'connectXmppClient'。 – 2012-04-29 16:09:08

+0

我有一個嘗試/抓住地方。但正如我所寫:IOError不會在第一次調用中發生。只有下一個(可能在幾個小時後)拋出我能捕獲的異常。這不好。我寧願(當然)注意到發送第一條消息時的連接故障,所以我可以快速重新建立連接並重新嘗試發送第一條消息。 – Alfe 2012-05-02 16:10:21

回答

1

您需要註冊使用xmppClient.RegisterDisconnectHandler()斷開處理程序。這使您可以指定一個將在斷開連接時調用的函數。

+0

它會在沒有調用.Process()的情況下工作嗎?去嘗試... – Alfe 2012-04-27 11:14:21

+0

斷開處理程序(當用你的方式註冊時)在發送第一條消息時不會被調用,對不起:-(當它試圖發送第二條消息時它會被調用,但是接着發生異常無論如何,我可以對此作出反應 感謝您的提示,但是我必須走很長的路,並且還會接收來自服務器的消息,我猜想 – Alfe 2012-05-02 16:12:51

+0

實現了接收,讓我們來看看這是否解決了我的無聲註銷問題。 – Alfe 2012-05-03 15:36:54