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

时间:2014-09-10 15:04:58

标签: javascript timeout xmpp ejabberd strophe

我有一个用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中查看客户端和服务器之间所有节的日志?

1 个答案:

答案 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是否是奇怪的服务器。

感谢大家的意见和建议!

致以最诚挚的问候,

克里斯