使用 strophejs 的 ejabberd XMPP 连接失败

Posted

技术标签:

【中文标题】使用 strophejs 的 ejabberd XMPP 连接失败【英文标题】:ejabberd XMPP connection failed using strophejs 【发布时间】:2015-09-05 16:36:33 【问题描述】:

我正在尝试在服务器端使用 ejabberd 运行 THIS XMPP JS 代码。这是我的连接代码:

$(document).bind('connect', function (ev, data) 
    console.log("connect "+JSON.stringify(data));
    var conn = new Strophe.Connection("http://localhost:5280/http-bind");

    conn.connect(data.jid, data.password, function (status) 
        console.log("status"+status);
        if (status === Strophe.Status.CONNECTED) 
            $(document).trigger('connected');
         else if (status === Strophe.Status.DISCONNECTED) 
            $(document).trigger('disconnected');
        
    );

    Hello.connection = conn;
);

我收到status = 1。过了一会儿,它开始继续显示: Uncaught Error: 11, flXHR::abort(): Failed, The abort() call failed to complete.

我的 ejabberd 在 http://localhost:5280/admin/ 上运行,admin@ejab 是管理员用户。

这里是完整的代码:

<!DOCTYPE html>
<html>
  <head>
    <title>Strophe.js Basic Example</title>
    <script src='http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js'></script>
    <script src='../strophe.js'></script>
<!--    <script src='scripts/flXHR.js'></script>
    <script src='scripts/strophe.flxhr.js'></script>-->
    <script src='basic.js'></script>
  </head>
  <body>
    <div id='login' style='text-align: center'>
      <form name='cred'>
        <label for='jid'>JID:</label>
        <input type='text' id='jid'>
        <label for='pass'>Password:</label>
        <input type='password' id='pass'>
        <input type='button' id='connect' value='connect'>
      </form>
    </div>
    <hr>
    <div id='log'></div>
  </body>
</html>

basic.js

var BOSH_SERVICE = 'http://localhost:5222/http-bind';
var connection = null;

function log(msg) 

    $('#log').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.');
    $('#connect').get(0).value = 'connect';
     else if (status == Strophe.Status.DISCONNECTING) 
    log('Strophe is disconnecting.');
     else if (status == Strophe.Status.DISCONNECTED) 
    log('Strophe is disconnected.');
    $('#connect').get(0).value = 'connect';
     else if (status == Strophe.Status.CONNECTED) 
    log('Strophe is connected.');
    connection.disconnect();
    


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

    $('#connect').bind('click', function () 
    var button = $('#connect').get(0);
    if (button.value == 'connect') 
        button.value = 'disconnect';

        connection.connect($('#jid').get(0).value,
                   $('#pass').get(0).value,
                   onConnect);
     else 
        button.value = 'connect';
        connection.disconnect();
    
    );
);

输出是:

Strophe is connecting.
SENT: <body rid='745165534' xmlns='http://jabber.org/protocol/httpbind' to='ejab' xml:lang='en' wait='60' hold='1' content='text/xml; charset=utf-8' ver='1.6' xmpp:version='1.0' xmlns:xmpp='urn:xmpp:xbosh'/>

【问题讨论】:

您使用的是哪个版本的 ejabberd 服务器?看来您有跨域问题,但这是在最新版本上自动处理的,所以我猜您使用的是旧的 ejabberd 版本。 你用的是哪个浏览器? chrome 版本 40.0.2214.91(64 位) 【参考方案1】:

status = 1 表示连接。这主要意味着无法访问 BOSH 服务器。

输入 http://localhost:5280/http-bind/ 在 Chrome 上查看您是否真的可以访问 BOSH 服务器。

如果您的服务器确实位于 localhost(您的计算机存储 hello.html),您可以注释掉 flXHR.js 和 strophe.flxhr.js 在 hello.html 的标题中,因为它们用于跨域访问。

例如hello.html 在您的桌面上,并使用托管在另一台计算机上的域(xmpp 服务器),由于跨域访问安全性,Chrome 不允许这样做。

如果 hello.html 和 xmpp 服务器位于同一台计算机上,则不会出现跨域问题。

无论如何,这两个文件似乎无法克服几年前 Chrome 浏览器设置的跨域访问限制。使用Chrome的参数“--disable-web-security”可以提供跨域访问进行测试。

最后,在 Chrome 浏览器中,右键单击选择“检查元素”-> 网络,重新加载 hello.html 并登录以检查那些 http-bind 访问。他们应该就出了什么问题给出提示。

【讨论】:

我已经更新了我的问题,这将帮助你我的进展。我在 mozilla 中尝试过,输出类似于 Strophe is connecting. SENT: &lt;body rid='745165534' xmlns='http://jabber.org/protocol/httpbind' to='ejab' xml:lang='en' wait='60' hold='1' content='text/xml; charset=utf-8' ver='1.6' xmpp:version='1.0' xmlns:xmpp='urn:xmpp:xbosh'/&gt; 当我浏览 http://localhost:5280/http-bind/ 时,它显示页面显示 ejabberd mod_http_bindAn implementation of XMPP over BOSH (XEP-0206)This web page is only informative. To use HTTP-Bind you need a Jabber/XMPP client that supports it.

以上是关于使用 strophejs 的 ejabberd XMPP 连接失败的主要内容,如果未能解决你的问题,请参考以下文章

如何从服务中调用strophejs-plugin-chatstates?

在 ejabberd 用户下线时离开组

Ejabberd 聚类理解

如何连接到已注册的节点(Erlang)并从 Ejabberd 使用它

使用 strophe js 在聊天中发送图像

MAC OS X 优胜美地上 ejabberd 15.0.4 上的 mod_rest 未启动