我有一个用Strophe编写的JavaScript XMPP客户端,它连接到hosted.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()
}
);
});
});
单击登录按钮会触发事件“connect”:
$(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书中的示例。无论如何,回调检查连接的状态,如果状态=== 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秒。
关于stanzas来回的日志,我想我需要快速编写一个处理程序来查看所有传入的节,或者是否可以在ejabberd中查看客户端和服务器之间所有节的日志?
答案 0 :(得分:2)
为了遇到此问题并遇到类似问题的其他人,此案例中的解决方案是hosted.im上的服务器每隔60秒发送一次ping请求,以检查客户端是否仍在线。
此ping请求如下所示:
<iq from="testserver.p1.im" to="chris@testserver.p1.im/23064809721410433741569348" id="164323654" type="get"> <ping xmlns="urn:xmpp:ping"></ping> </iq>
当然,需要的是形成一个响应,看起来像这样:
<iq from="chris@testerver.p1.im" to="testserver.p1.im" id="164323654" type="result" xmlns="jabber:client"><ping xmlns="urn:xmpp:ping"/></iq>
注意&#34;到&#34; -attribute。我在开始时省略了它,因为我假设发送的没有to-attribute的消息被自动假定为客户端 - >服务器消息。但不是在这种情况下。不确定这是否是一般的情况,或者在hosted.im是否是奇怪的服务器。
感谢大家的意见和建议!
致以最诚挚的问候,
克里斯