2012-10-05 55 views
3

我想在jaxl中发送消息后执行一些代码。 哪种回调适合这种情况?jaxl在发送消息回调后

public function test() { 

     require_once 'JAXL/jaxl.php'; 
     global $client; 

     $client = new JAXL(array(
      'jid' => '[email protected]', 
      'pass' => 'password', 
      'log_level' => JAXL_INFO 
     )); 

     $client->add_cb('on_stream_features', function($stanza) { 
      global $client,$thisObj; 
      $client->send_chat_msg('[email protected]','Message'); 
     }); 

     $client->add_cb('on_message_send',function(){ //some thing like this 
     //some code 
     }); 
} 

回答

2

Jaxl库目前不支持这种回调。这是因为当您在底层JAXLSocketClient的输出缓冲区中调用$client->send_chat_msg()XMPPStream队列XMPPMsg对象时。当套接字准备好写入时,输出缓冲区将被刷新。

之前XMPPStream排队所有XMPPStanza的是序列化(to_string()),从而根本JAXLSocketClient输出缓冲器所不知道的关于其在写就绪插座节被刷新。因此目前没有这种回调是可能的。

有一些非权威的方式来检查邮件的发送状态,例如:输出缓冲区是否为空?但这是棘手的,而不是一个完美的解决方案。

实现这样的回调将是的XMPPStream的背景下,那么这应当通知有关潜在的插座内保持输出缓冲器完美的方式写就绪状态,最后冲洗节的在插座前,XMPPStream可以执行这些回调。不幸的是,这不是图书馆设计的方式。虽然,可能性是这种回调可能在图书馆的未来版本中得到支持。

+1

谢谢你的回答。 我想发送一条消息,然后断开流。 你对这种情况有什么建议? – superuser

+3

通过调用'$ client-> send_chat_msg();'来简单地排队消息,然后通过调用'$ client-> send_end_stream();'立即排队XMPP流结束数据包(即断开客户端)。另外不要忘记为'on_disconnect'事件注册回调。一旦你收到回调,你确定你的消息节已经发送。 Jaxl库确保有序的消息转发,即消息包在流结束数据包之前已排队,它将保证它们以相同的顺序发送。因此,在您的消息节发送之前,您将不会收到'on_disconnect'回调。 –

+0

谢谢,它的工作原理。 – superuser