【问题标题】:Strophe.js client connecting to server, disconnect/timeoutStrophe.js 客户端连接到服务器,断开/超时
【发布时间】: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 的 XMLInputXMLOutput 以查看节。
  • 还有一件事,您是否尝试过将可选的waithold 变量传递给connect() 函数?我不确定它是否会有所作为,但也许可以试试conn.connect(data.jid, data.password, function(..){...}, 60, 1);
  • Strophe 应该每 60 秒发送一个新节。如果没有,那可能就是您断开连接的原因。在您的控制台中,您应该会看到正在发送的正文,应该如下所示:

标签: javascript timeout xmpp ejabberd strophe


【解决方案1】:

为了其他遇到此问题并遇到类似问题的人,在这种情况下的解决方案是 hosts.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-attribute 的消息被自动假定为 client->server 消息。然而,在这种情况下不是。不确定这是否是一般情况,或者这是否是hosted.im 的服务器奇怪。

感谢大家的cmets和建议!

最好的问候,

克里斯

【讨论】:

    猜你喜欢
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 2017-10-25
    • 1970-01-01
    • 1970-01-01
    • 2018-02-09
    • 2013-11-30
    • 1970-01-01
    相关资源
    最近更新 更多