检测python xmpp超时

检测python xmpp超时,python,timeout,xmpp,ping,disconnect,Python,Timeout,Xmpp,Ping,Disconnect,我有一个应用程序将发送xmpp消息。这种情况很少见(有时几天内都没有),但之后可能会出现成群结队的情况。我没有收到任何东西的用处,我只是想发送。直接的方法会遇到未检测到的超时。最后一个send()没有发生(接收方没有得到任何信息),但返回时没有报告问题(返回一个简单的id,就好像一切正常)。只有对send()的下一次调用才会引发IOError('从服务器断开连接') 我可以对每条消息进行持续的断开/重新连接,但我不喜欢这样,因为有时这样会经常断开和重新连接(我不知道服务器是否会在一秒钟内多次使用

我有一个应用程序将发送xmpp消息。这种情况很少见(有时几天内都没有),但之后可能会出现成群结队的情况。我没有收到任何东西的用处,我只是想发送。直接的方法会遇到未检测到的超时。最后一个
send()
没有发生(接收方没有得到任何信息),但返回时没有报告问题(返回一个简单的id,就好像一切正常)。只有对
send()
的下一次调用才会引发IOError('从服务器断开连接')

我可以对每条消息进行持续的断开/重新连接,但我不喜欢这样,因为有时这样会经常断开和重新连接(我不知道服务器是否会在一秒钟内多次使用此功能)

我可以尝试这里给出的答案,但我并不需要接收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
导入xmpp
def connectXmppClient(来自JIDNAME,密码):
fromJid=xmpp.protocol.JID(fromJidName)
xmppClient=xmpp.Client(fromJid.getDomain(),debug=[])
connection=xmppClient.connect()
如果没有连接:
引发异常(“无法设置连接”,来自JID)
身份验证=xmppClient.auth(
fromJid.getNode(),密码,resource=fromJid.getResource())
如果不是身份验证:
引发异常(“无法验证”)
返回xmppClient
def sendXmppMessage(xmppClient,toJidName,文本):
返回xmppClient.send(xmpp.protocol.Message(toJidName,text))
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
导入系统、操作系统、时间、getpass
如果len(系统argv)<2:
打印“语法:xsend fromJID到jid”
系统出口(0)
fromJidName=sys.argv[1]
toJidName=sys.argv[2]
password=getpass.getpass()
xmppClient=connectXmppClient(来自jidname,密码)
尽管如此:
line=sys.stdin.readline()
如果不是直线:
打破
打印xmppClient.isConnected()
id=sendXmppMessage(xmppClient,toJidName,行)
打印id

您需要使用注册断开连接处理程序。这允许您指定一个在断开连接时调用的函数。

为什么不将
xmppClient.send
放入
try:catch:
?您可以只检查异常的类型。如果是
IOError
,请再次调用
connectXmppClient
。我已经准备好了一个try/catch。但正如我所写的:IOError不会在第一次调用中发生。只有下一个(可能几个小时后)抛出我可以捕获的异常。那不好。我希望(当然)在发送第一条消息时注意到连接中断,这样我可以快速重新建立连接并重新尝试发送第一条消息。发送第一条消息时不会调用断开处理程序(使用您的方式注册时),抱歉:-(稍后,当我尝试发送第二条消息时,会调用它。但是,无论如何,会引发一个异常,我可以对此作出反应。尽管如此,感谢您的提示,但我还是要走很长的路,并从我猜的服务器接收消息。实现了接收。让我们看看这是否解决了我的静默注销问题。