XMPP Web 客户端(使用 strophe.js)花时间连接 ejabberd 服务器

Posted

技术标签:

【中文标题】XMPP Web 客户端(使用 strophe.js)花时间连接 ejabberd 服务器【英文标题】:XMPP web client (using strophe.js) taking time to connect with ejabberd server 【发布时间】:2014-08-02 16:03:59 【问题描述】:

我已经为 javascript 实现了一个 XMPP 客户端(使用 strophe.js),为此我指的是 Jack Moffitt 的Professional XMPP with JavaScript and jQuery一书。

这本书对使用“strophe.js”的 XMPP JavaScript 客户端的工作进行了很好的解释。

使用我的代码,XMPP Web 客户端需要 6 秒才能连接到 XMPP 服务器(使用 BOSH 的 ejabberd),这对我的应用程序来说是不可取的。

有人能解释一下为什么会这样吗?

我的 XMPP 客户端代码如下:

var Arthur = 

    connection: null,
    jid:"20147001@localhost",
    password: "XXXX2014",
    handle_message: function (message) 
        if ($(message).attr('from')) 

            if($(message).attr('from').match(/^abcd007@localhost/))
            console.log("inside message received");
            var body = $(message).find('body').contents();

            var span = $("<span></span>");
            body.each(function () 
            if (document.importNode) 
            $(document.importNode(this, true)).appendTo(span);
            console.log(span);
            console.log(span.text());
            
            );
            notiReceived(span.text());
            console.log("afte notiReceived executed");
            
            if($(message).attr('from').match(/^xyz2014@localhost/))
                console.log("inside message received");
                var body1 = $(message).find('body').contents();
                var span1 = $("<span></span>");
                body1.each(function () 
                if (document.importNode) 
                $(document.importNode(this, true)).appendTo(span1);
                //console.log(span.find('text'));
                console.log(span1);
                console.log(span1.text());
                
                );
                notiReceived(span1.text());
                console.log("afte notiReceived executed");
                

            
        return true;
    
;

 function sendPushNotification(to,operation,request_id,message)

     if(to=="citizen")
     var myObject = new Object();
     myObject.FROM="Executive";
     myObject.FUNCTION=operation;
     myObject.MESSAGE = message;
     myObject.REQUESTID= request_id;

   console.log("inside citizen::"+myObject);
   var myString = JSON.stringify(myObject);
   $(this).val('');
   var msg = $msg(to: 'abcd007@localhost', type: 'chat')
       .c('body').t(myString);
   console.log("inside keypress data is::"+msg);

   Arthur.connection.send(msg);
    
  if(to=="technician")

      var myObject1 = new Object();
      myObject1.FROM="Executive";
         myObject1.FUNCTION=operation;
         myObject1.MESSAGE = "Check Request Status";
         myObject1.REQUESTID= request_id;

       console.log("inside technician:"+myObject1);
       var myString1 = JSON.stringify(myObject1);
       $(this).val('');
       var msg1 = $msg(to: 'xyz2014@localhost', type: 'chat')
           .c('body').t(myString1);
       console.log("after msg send to technician"+msg1);

       Arthur.connection.send(msg1);  
  
 ;


 function connected() 
     console.log("inside connected");

    Arthur.connection.addHandler(Arthur.handle_message,
                                 null, "message", "chat");
    console.log("inside connected");
    Arthur.connection.send($pres());
;

 function disconnected() 
    console.log("disconnected");
    Arthur.connection = null;
;

function disconnect()
    Arthur.connection.disconnect();
;

function connectXMPP() 
    var conn = new Strophe.Connection(
            hosturl.URL+":5280/http-bind");
    console.log("inside connection");
   conn.connect(Arthur.jid, Arthur.password, function (status) 
       if (status === Strophe.Status.CONNECTED) 
           connected();
           console.log("connected");
        else if (status === Strophe.Status.DISCONNECTED) 
          disconnected();
       
   );

   Arthur.connection = conn;
 ;

【问题讨论】:

您是说conn.connect() 回调需要6 秒才能被触发?尝试使用您的浏览器网络调试器来查看它是否只是来自 ejabberd 的缓慢响应。 是的,conn.connect() 被触发后需要 6 秒,正如你所说,当涉及到 bosh 时,ejabberd 的响应速度很慢,我试图从我的 android 应用程序连接到 ejabberd 服务器使用 asmak ,在我的移动数据网络(2g)上花费的时间不超过 1 秒!!!!!!!!!!!! 我想在这里分享的一个观察结果“conn.connect()”正在同步处理,因此在一段时间内(比如 6 秒),浏览器会挂起!!! 【参考方案1】:

我不知道这里是否是这种情况,但通常当连接需要很长时间才能建立时,原因通常是主机名解析问题。 例如,如果主机同时具有 IPv4 和 IPv6 地址,但没有 IPv6 连接,但首先尝试 IPv6,那么您可能会遇到延迟,直到 IPv6 连接尝试超时。

要检查域名解析是否是原因,您可能需要使用Wireshark 等工具查看网络流量。

【讨论】:

感谢您的回答,您的回答很重要,如何使用 firebug 检查网络流量?? 感谢您向我推荐“Wireshark”,伟大的开源软件,并且网络客户端正在将请求解析为 ip4 没有 ip6 请求,我可以肯定地说这是因为,在将 ip6 过滤器放入 Wireshark 并重新连接到xmpp服务器(ejabberd),没有关于“localhost:5280/http-bind”的结果(表示没有请求解析ip6)!!!!!!

以上是关于XMPP Web 客户端(使用 strophe.js)花时间连接 ejabberd 服务器的主要内容,如果未能解决你的问题,请参考以下文章

XMPP Web 客户端(使用 strophe.js)花时间连接 ejabberd 服务器

Android XMPP服务器, BOSH(Http-Binding)和WEB客户端搭建

XMPP Web 客户端 [关闭]

龙卷风 Web 应用程序中的 Python xmpp jabber 客户端

XMPP Chat 与不在网络中的客户端一起使用

如何将 JavaScript XMPP 客户端(JSXC)配置到网站?