我有一個應用程序將發送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
爲什麼不把'xmppClient.send'放在'try:catch:'中?你可以檢查異常的類型。如果它是'IOError',那麼再次調用你的'connectXmppClient'。 – 2012-04-29 16:09:08
我有一個嘗試/抓住地方。但正如我所寫:IOError不會在第一次調用中發生。只有下一個(可能在幾個小時後)拋出我能捕獲的異常。這不好。我寧願(當然)注意到發送第一條消息時的連接故障,所以我可以快速重新建立連接並重新嘗試發送第一條消息。 – Alfe 2012-05-02 16:10:21