使用 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: <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'/>
当我浏览 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?