3

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

メッセージごとに一定の切断/再接続を行うことはできますが、これは頻繁に切断および再接続されることがあるため、これは好きではありません(サーバーがこれを1秒間に複数回評価するかどうかはわかりません)。

ここで、この質問の回答として示されているアプローチを試すことができますが、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
4

1 に答える 1

1

xmppClient.RegisterDisconnectHandler()を使用して切断ハンドラーを登録する必要があります。これにより、切断時に呼び出される関数を指定できます。

于 2012-04-25T18:40:07.057 に答える