2012-04-23 45 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