我有一个应用程序将发送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