簡體   English   中英

檢測python-xmpp超時

[英]detect python-xmpp timeouts

我有一個應該發送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

您需要使用xmppClient.RegisterDisconnectHandler()注冊斷開處理程序。 這允許您指定在斷開連接時調用的函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM