所以...我有一个像这样简单的聊天客户端:
class ChatClient(sleekxmpp.ClientXMPP):
def __init__(self, jid, password, server):
sleekxmpp.ClientXMPP.__init__(self, jid, password, ssl=True)
self.add_event_handler("session_start", self.start)
self.register_plugin('xep_0030')
self.register_plugin('xep_0004')
self.register_plugin('xep_0060')
self.register_plugin('xep_0199')
self.ssl_version = ssl.PROTOCOL_SSLv3
self.connected = self.connect()
if self.connected:
self.process(threaded=True)
def start(self, event):
self.send_presence(priority = "-9001")
self.get_roster(blocking = True, timeout = 3)
def message(self, targets, msg):
for target in targets:
self.send_message(target, msg)
我有一个“验证”功能,以确保您输入您的用户名/密码:
def authenticate(username, password, server):
xmppuser = username + '@' + server
passTester = ChatClient(xmppuser, password)
passTester.disconnect(wait = True)
authenticated = passTester.authenticated
return authenticated
现在,问题在于我将聊天客户端作为线程,我遇到了在服务器有机会实际连接之前我尝试检查ChatClient.authenticated的情况。正如你所看到的,我试图在断开连接时“等待”,但发送队列中没有任何东西,所以它立即断开连接。
我试过的另一个是:
def authenticate(username, password, server):
xmppuser = username + '@' + server
passTester = ChatClient(xmppuser, password)
passTester.message('bogusName', 'ladfhkjdglkhjdfg')
passTester.disconnect(wait = True)
authenticated = passTester.authenticated
return authenticated
现在我发送了一条虚假消息,断开连接呼叫还有待等待。当我使用此代码输入正确的用户名/密码时,断开连接等待发送消息(这涉及等待真正的连接),不发送任何内容并且ChatClient.authenticated设置为True!
不幸的是,当我输入错误的用户名/传递时,邮件永远不会被发送,并且断开连接(wait = True)永远不会断开连接,因为邮件永远不会被发送。
有没有其他人有更合适的方式来“验证”?
答案 0 :(得分:3)
这是将.authenticated
及相关字段更改为threading.Event
个对象的一个很好的理由,以便您可以使用wait()
这样的情况,但我不知道如何这会破坏现有的用户代码。
但是,如果不修改SleekXMPP,你需要做的就是等待某些事件发生。例如,如果您的客户端成功通过身份验证,则会有session_start
个事件(我可能会在之后添加auth_success
或类似事件)。同样,如果单个机制的身份验证失败,则会发生failed_auth
事件。如果没有任何身份验证方法成功(这是您感兴趣的话),则会有no_auth
个事件。
因此,您可以为这些事件添加处理程序,并让这些处理程序将令牌放入队列中,然后等待所需的令牌到达。
class ChatClient(ClientXMPP):
def __init__(self, ...):
...
self.auth_queue = queue.Queue()
self.add_event_handler('no_auth', self.failed)
def start(self, event):
self.auth_queue.put('success')
...
def failed(self, event):
self.auth_queue.put('failed')
def authenticate(username, password, server):
xmppuser = username + '@' + server
passTester = ChatClient(xmppuser, password)
try:
result = passTester.auth_queue.get(timeout=10)
except queue.Empty:
result = 'failed'
passTester.disconnect()
return result == 'success'
不要忘记我们还有一个聊天室,位于sleek@conference.jabber.org。
- Lance