2012-10-05 54 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