2012-04-23 6 views
3

xmppメッセージを送信するアプリケーションがあります。それらの機会はまれである(時には何日もない)が、再び多分入ってくるかもしれない。私は何も受け取っていないので、送るだけです。単純なアプローチでは、検出されないタイムアウトが発生します。最後のsend()は発生しません(レシーバは何も取得しません)。問題を報告せずに戻ります(すべて正常に動作したかのように単純なIDを返します)。 次にsend()を呼び出すとが呼び出され、IOError( 'サーバーから切断されました')が発生します。python-xmppタイムアウトを検出する

メッセージごとに一定の切断/再接続を行うことができますが、これはしばしば切断されて再接続されることがあるため、このようには気に入らない場合があります。

ここで答えはthis questionにありますが、実際にはXMPPの返信を受け取る必要はありません。

質問:前か(うまく働いた場合のすべてに受信機をスパムう)第2のメッセージを送信しようとせずに送信した後、接続タイムアウトを検出への簡単な方法はありますか?

マイストレートフォワード・アプローチ:

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

その切断ハンドラ(途中で登録したとき)は、最初のメッセージを送信したときに呼び出されません。残念ですが:-(2番目のメッセージを送信しようとすると後で呼び出されます。とにかく投げられて、私はそれに反応することができます。 あなたのヒントにもかかわらず、私は長い道のりを歩かなければならず、私は推測するサーバーからメッセージを受け取ります。 – Alfe

+0

受信を実装しました。問題。 – Alfe

関連する問題