发送消息回调后的 jaxl

Posted

技术标签:

【中文标题】发送消息回调后的 jaxl【英文标题】:jaxl after send message callback 【发布时间】:2012-10-05 15:31:55 【问题描述】:

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

    public function test() 

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

        $client = new JAXL(array(
            'jid' => 'user@localhost',
            'pass' => 'password',
            'log_level' => JAXL_INFO
        ));

        $client->add_cb('on_stream_features', function($stanza)  
            global $client,$thisObj;
            $client->send_chat_msg('otherUser@localhost','Message');  
        );

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

【问题讨论】:

【参考方案1】:

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

在排队之前,所有XMPPStanza 都由XMPPStream 序列化(to_string()),因此底层JAXLSocketClient 输出缓冲区不知道哪个节正在通过写就绪套接字刷新。因此,目前无法进行此类回调。

有一些非权威的方法可以检查您的邮件的传递状态,例如输出缓冲区是空的吗?但这很棘手,并不是一个完美的解决方案。

实现此类回调的完美方法是在XMPPStream 的上下文中维护输出缓冲区,然后应通知底层套接字写入就绪状态,最后在通过套接字刷新节之前,XMPPStream 可以执行这些回调.不幸的是,这不是图书馆的设计方式。不过,这种回调可能会在库的未来版本中得到支持。

【讨论】:

感谢您的回答。我想发送一条消息,然后断开流。您对这种情况有什么建议? 只需调用$client->send_chat_msg(); 将您的消息排队,然后您可以立即通过调用$client->send_end_stream(); 将XMPP 流结束数据包排队(即断开您的客户端)。也不要忘记为on_disconnect 事件注册回调。一旦您收到该回调,您就确定您的消息节已发送。 Jaxl 库确保消息按顺序转发,即,由于消息包在流结束包之前排队,它将保证它们以相同的顺序发送。因此,在您发送消息节之前,您不会收到on_disconnect 回调。

以上是关于发送消息回调后的 jaxl的主要内容,如果未能解决你的问题,请参考以下文章

将消息发送到 XMPP 服务器的 php 函数不提供日志并且不起作用

JACK XMPP 守护进程发送和接收消息

无法发送群组消息 - 错误 400 - 修改 - BadRequest

xmpphp XMPP,从 php 脚本发送消息

基于 JAXL 的聊天客户端。需要帮助连接到 Gtalk 或其他服务器以进行测试

在回调之外按需发送 websocket 消息?