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客户端搭建