检测python-xmpp超时

时间:2012-04-23 15:23:19

标签: python timeout xmpp ping disconnect

我有一个应该发送xmpp消息的应用程序。那些场合很少见(有时候几天都没有)但是再一次可能会成串。我没有收到任何东西,我只想发送。直接的方法会遇到未检测到的超时。最后send()没有发生(接收器没有得到任何东西)但返回没有报告问题(返回一个简单的id,好像一切正​​常)。只有 next 调用send()然后引发IOError('与服务器断开连接'。)。

我可以为每条消息进行持续的断开连接/重新连接,但我不喜欢这样,因为有时这会断开并经常重新连接(我不知道服务器是否会在一秒钟内多次欣赏)。< / p>

我可以尝试在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

1 个答案:

答案 0 :(得分:1)

您需要使用xmppClient.RegisterDisconnectHandler()注册断开处理程序。这允许您指定在断开连接时调用的函数。