【发布时间】:2014-11-04 07:22:32
【问题描述】:
我有一个用 Strophe 编写的小型 JavaScript XMPP 客户端,它连接到托管在 hosts.im 上的服务器。我认为hosted.im 在他们的后端使用ejabberd。
我使用建立连接
Strophe.Connection(myBoshService), 并且能够来回发送聊天消息。但是,一段时间后,如果没有活动,似乎会自动断开连接。
现在,我的问题是,什么是保持会话活跃的好方法,这样它就不会断开连接。断开时间似乎很短,大约 60 秒左右。
我是否应该来回发送某种活动以使其保持打开状态?或者,这对我来说似乎更简单,我应该以某种方式更改会话的超时。如果是这样,我在哪里可以改变这个?这是服务器设置,不管 Strophe.Connection 对象,还是我可以在初始化 Strophe.Connection 时设置超时?
感谢所有帮助。
最好的问候,
克里斯
编辑:这是我用于连接的代码:
我通过一个全局变量Hello来管理连接(是的,名字很别扭,我是从一个例子中取的):
var Hello = {
connection: null,
start_time: null,
partner: {
jid: null,
name: null
},
log: function (msg) {
$('#log').append("<p>" + msg + "</p>");
},
send_ping: function (to) {
var ping = $iq({
to: to,
type: "get",
id: "ping1"}).c("ping", {xmlns: "urn:xmpp:ping"});
Hello.log("Sending ping to " + to + ".");
console.log("Sending ping to " + to + ".");
Hello.start_time = (new Date()).getTime();
Hello.connection.send(ping);
},
handle_pong: function (iq) {
var elapsed = (new Date()).getTime() - Hello.start_time;
Hello.log("Received pong from server in " + elapsed + "ms.");
console.log('Received pong from server in " + elapsed + "ms.');
$('#login').hide();
$('#chat').show();
//window.location = "chat.html";
//Hello.connection.disconnect();
return true;
},
//"<active xmlns="http://jabber.org/protocol/chatstates"/><body xmlns="http://jabber.org/protocol/httpbind">tuiuyi</body>"
displayIncomingText: function (text) {
var body = $(text).find("xml > body");
if (body.length === 0)
{
body = $(text).find('body');
if (body.length > 0)
{
body = body.text();
$('#chattext').append("<p>"+ body + "</p>");
}
else
{
body = null;
}
}
return true;
},
readRoster: function (iq) {
$(iq).find('item').each(function () {
var jid = $(this).attr('jid');
var name = $(this).attr('name') || jid;
Hello.partner.name = name;
Hello.partner.jid = jid;
});
return true;
}
};
这里主要的相关对象是 Hello.connect 和 Hello.partner,它们存储帐户名册上唯一人员的 jid,因为这是一对一的聊天。
然后,在$(document).ready中,我绑定了两个按钮分别连接和发送消息:
$(document).ready(function () {
$('#chat').hide();
$('#chatSend').bind('click', function () {
Hello.connection.send(
$msg(
{to : Hello.partner.jid, type : 'chat'}
).c('body').t($('#chattextinput').val())
);
$('#chattext').append("<p align='right'>" + $('#chattextinput').val() + "</p>");
});
$('#SignIn').bind('click', function () {
$(document).trigger('connect', {
jid: $('#eMail').val(), password: $('#password_f').val()
}
);
});
});
点击登录按钮触发“连接”事件:
$(document).bind('connect', function (ev, data) {
console.log('connect fired');
var conn = new Strophe.Connection("http://bosh.metajack.im:5280/xmpp-httpbind");
conn.connect(data.jid, data.password, function (status) {
console.log('callback being done');
if (status === Strophe.Status.CONNECTED) {
alert('connected!');
$(document).trigger('connected');
alert('Connected successfully');
} else if (status === Strophe.Status.DISCONNECTED) {
$(document).trigger('disconnected');
}
else
{
Hello.log("error");
console.log('error');
}
});
Hello.connection = conn;
});
这将创建 Strophe.Connection 并将其存储在 Hello.connection 中。此外,它设置连接对象的回调函数。此代码直接取自 Strophe.js 书中的示例。无论如何,回调会检查连接的状态,如果 status === Strophe.Status.DISCONNECTED,则触发“断开连接”,它只会这样做:
$(document).bind('disconnected', function () {
Hello.log("Connection terminated.");
console.log('Connection terminated.');
// remove dead connection object
Hello.connection = null;
});
无论如何,由于某种原因,正在发生的事情是,在使用 conn.connect 设置的回调中,在很短的时间后,状态评估为 Strophe.Status.DISCONNECTED,我不知道为什么,除非在某个地方,要么在服务器或连接对象中,指定了一个超时,这似乎是 ca。 60 秒。
关于来回的节的日志,我想我需要快速编写一个处理程序来查看所有传入的节,或者是否可以在 ejabberd 中查看客户端和服务器之间的所有节的日志?
【问题讨论】:
-
Strophe 无法保持连接超过 60 秒似乎很奇怪.. 当您断开连接时,它是优雅的吗?你从服务器得到什么类型的节?有一些与 BOSH 空闲超时相关的服务器端设置,但除非 Strophe 的连接已暂停,否则不应触发这些设置,否则应保持连接。
-
您能否提供代码显示您对 Strophe Connection 的
connect()的调用以及断开连接期间发送的节的日志。 -
捕获传入和传出节的一种简单方法是使用网络调试工具,例如 fiddler,或者您可以使用内置网络调试器的浏览器,但 fiddler 也可以将节显示为已解析XML 文档,可以更轻松地查看正在发生的事情。您还可以将自定义处理程序添加到 Strophe 的
XMLInput和XMLOutput以查看节。 -
还有一件事,您是否尝试过将可选的
wait和hold变量传递给connect()函数?我不确定它是否会有所作为,但也许可以试试conn.connect(data.jid, data.password, function(..){...}, 60, 1); -
Strophe 应该每 60 秒发送一个新节。如果没有,那可能就是您断开连接的原因。在您的控制台中,您应该会看到正在发送的正文,应该如下所示:
标签: javascript timeout xmpp ejabberd strophe