XMPP连接管理器“Strophe.Connection”返回ATTACHED状态而不是CONNECTED

时间:2012-02-26 15:47:28

标签: jquery xmpp openfire strophe

我使用Strophe.Connection来创建和初始化Strophe.Connection对象,并使用'connect'函数启动连接过程,但它返回ATTACHED状态而不是书中预期的CONNECTED。

此代码来自Jack Moffitt的使用JavaScript和JQuery的专业XMPP编程“但它对我不起作用:-(

我已经过了一整天,我头疼得厉害。任何帮助将是欣赏。 谢谢,

以下是代码:

$(document).bind('connect', function (ev, data) {
    var conn = new Strophe.Connection(
        "http://localhost:5280/xmpp-httpbind");
    conn.connect(data.jid, data.password, function (status) {
        if (status === Strophe.Status.CONNECTED) {
            $(document).trigger('connected');
        } else if (status === Strophe.Status.DISCONNECTED) {
            $(document).trigger('disconnected');
        } 
    });

为了理解发生了什么,我已将代码修改为此(具有连接状态):

$(document).bind('connect', function (ev, data) {
    var conn = new Strophe.Connection(
        "http://localhost:5280/xmpp-httpbind");
    conn.connect(data.jid, data.password, function (status) {
        if (status === Strophe.Status.CONNECTED) {
            $(document).trigger('connected');
        } else if (status === Strophe.Status.DISCONNECTED) {
            $(document).trigger('disconnected');
        } else if (status === Strophe.Status.ERROR) {
            alert ('status ERROR');
        } else if (status === Strophe.Status.CONNECTING) {
            alert ('status CONNECTING');
        } else if (status === Strophe.Status.CONNFAIL) {
            alert ('status CONNFAIL');
        } else if (status === Strophe.Status.AUTHENTICATING) {
            alert ('status AUTHENTICATING');
        } else if (status === Strophe.Status.AUTHFAIL) {
            alert ('status AUTHFAIL');
        } else if (status === Strophe.Status.ATTACHED);
            alert ('status ATTACHED');

它向我展示了两个状态:CONNECTING然后ATTACHED。为什么我不能按照预期的那样具有CONNECTED状态???

3 个答案:

答案 0 :(得分:0)

需要更多信息来诊断这一点。您可以尝试在Firefox或Chrome中运行,并在开发人员工具中查看网络面板,以查看实际发生的错误。

我想这只是一个跨域请求问题。

答案 1 :(得分:0)

我设法让Strophe使用我的Openfire服务器,在.htaccess中添加一条新规则,将请求重定向到http-bind。

RewriteRule http-bind/ http://www.mydomain.info:7070/http-bind/ [P]

JS代码:

var DEV = {};
var jq  = jQuery;
DEV.APP = {};
var BOSH_SERVICE = 'http://www.mydomain.info/http-bind/';
var connection = null;

function log(msg) 
{
    jq('body').append('<div></div>').append(document.createTextNode(msg));
}

function rawInput(data)
{
    log('RECV: ' + data);          
}

function rawOutput(data)
{
    log('SENT: ' + data);
}

function onConnect(status)
{
    if (status == Strophe.Status.CONNECTING) {
        log('Strophe is connecting.');
    } else if (status == Strophe.Status.CONNFAIL) {
        log('Strophe failed to connect.');
    } else if (status == Strophe.Status.DISCONNECTING) {
        log('Strophe is disconnecting.');
    } else if (status == Strophe.Status.DISCONNECTED) {
        log('Strophe is disconnected.');
    } else if (status == Strophe.Status.CONNECTED) {
        log('Strophe is connected.');
        // connection.disconnect();
    }
}

jq(document).ready(function () {
    connection = new Strophe.Connection(BOSH_SERVICE);
    connection.rawInput = rawInput;
    connection.rawOutput = rawOutput;

    connection.connect("username", "password", onConnect);
});

请注意,即使您尝试访问位于同一域但位于不同端口的资源,也会应用跨域策略。

希望这有帮助。

编辑:   我的.htaccess看起来像:

Options +FollowSymLinks
RewriteEngine On

RewriteBase /

RewriteRule http-bind/ http://www.domain.info:7070/http-bind/ [P]

答案 2 :(得分:0)

我选择“魔劫”的建议。我从来没有使用过chrome网络面板,但是在firefox中,我发现firebug非常方便。安装firebug后,您需要做的就是“启用所有面板”。在“网络”标签下,您可以收到所有发送和接收的请求。在“Net”下,“All”选项卡基本上是firebug显示所有网络活动的地方。现在,在列表底部的某些位置,您必须能够看到您的http-bind请求(在我的笔记本电脑上,我在Apache上设置了BOSH,并且代理设置为“http-bind”;具体地址取决于您的设置) 。展开http-bind节点,然后选择“发布”选项卡。在那里,您将能够看到您的HTTP Post请求。现在,如果单击“响应”,它会显示您从XMPP服务器获得的响应。 Here是火虫创建者自己的教程。