gpt4 book ai didi

javascript - Strope.js 客户端连接到服务器,断开连接/超时

转载 作者:行者123 更新时间:2023-12-02 17:00:29 25 4
gpt4 key购买 nike

我有一个用 Strope 编写的小型 JavaScript XMPP 客户端,它连接到 Hosted.im 上托管的服务器。我认为 Hosted.im 在其后端使用 ejabberd。

我使用建立连接

Strope.Connection(myBoshService), 并且能够来回发送聊天消息。但是,在一段时间后,如果没有事件,似乎会自动断开连接。

现在,我的问题是,保持 session 处于事件状态以使其不会断开连接的好方法是什么。断开连接的时间好像很短,大概60秒左右。

我应该来回发送某种事件以使其保持打开状态吗?或者,这对我来说似乎更简单,我应该以某种方式改变 session 的超时时间。如果是这样,我可以在哪里更改它?这是服务器设置,与 Strope.Connection 对象无关,还是我可以在初始化 Strope.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中,我绑定(bind)了两个按钮,分别用于连接和发送消息:

$(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;
});

这将创建 Strope.Connection 并将其存储在 Hello.connection 中。此外,它还设置连接对象的回调函数。此代码直接取自 Strope.js 书中的示例。不管怎样,回调会检查连接的状态,如果 status === Strope.Status.DISCONNECTED,则触发“disconnected”,这只执行以下操作:

$(document).bind('disconnected', function () {
Hello.log("Connection terminated.");
console.log('Connection terminated.');
// remove dead connection object
Hello.connection = null;
});

无论如何,发生的事情是,由于某种原因,在使用 conn.connect 设置的回调中,经过很短的时间,状态评估为 Strope.Status.DISCONNECTED,我不确定为什么,除非在某个地方,或者在服务器或连接对象中,指定了一个超时,这似乎是 ca。 60 秒。

至于来回的节日志,我想我需要快速编写一个处理程序来查看所有传入的节,或者是否可以在 ejabberd 中查看客户端和服务器之间的所有节的日志?

最佳答案

为了其他遇到此问题并遇到类似问题的人,本例中的解决方案是,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>

注意“to”属性。我一开始就省略了它,因为我假设发送的没有 to 属性的消息会自动假定为客户端->服务器消息。但在本例中并非如此。不确定这是否是普遍情况,或者是否是 Hosted.im 的服务器的一个奇怪现象。

感谢大家的意见和建议!

最诚挚的问候,

克里斯

关于javascript - Strope.js 客户端连接到服务器,断开连接/超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25768891/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com