2012-04-23 3 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를 호출하십시오. –

+0

나는 try/catch를 준비해두고있다. 하지만 내가 쓴 것처럼 : IOError는 첫 번째 호출에서 발생하지 않습니다. 단지 다음 시간 (나중에 몇 시간이 될 수있다)은 내가 잡을 수있는 예외를 던집니다. 그 좋지 않다. 차라리 (물론) 첫 번째 메시지를 보낼 때 연결이 끊어진 것을 알기 때문에 연결을 다시 설정하고 첫 번째 메시지를 보내도록 다시 시도 할 수 있습니다. – Alfe

답변

1

당신은 xmppClient.RegisterDisconnectHandler()를 사용하여 분리 핸들러를 등록해야합니다. 이를 통해 연결 해제시 호출 될 함수를 지정할 수 있습니다.

+0

내 예제에서와 같이 .Process()를 호출하지 않고도 작동합니까? 시도해 보러 간다 ... – Alfe

+0

연결 해제 처리기 (길을 사용하여 등록 할 때)는 첫 번째 메시지를 보내면 호출되지 않고 미안 해요 :-(두 번째 메시지를 보내려고하면 나중에 호출되지만 나중에 예외가 발생합니다. 어쨌든 던져지면 나는 그것에 반응 할 수 있습니다. 힌트를 보내 주셔서 감사합니다.하지만 먼 길을 가야하고 서버에서 메시지를 수신해야합니다. – Alfe

+0

수신을 구현했습니다. 이것이 내 자동 로그인을 해결하는지 봅시다. 발행물. – Alfe