我使用了crossdomain中的示例连接到我的本地openfire xmpp服务。 只需更改BOSH网址即可容纳我当地的openfire服务。
我测试了所以我知道openfire本身有效。我可以成功连接Pidgin。
(该网站在码头内运行)
(实际)openfire安装在localhost上运行
提交表单后执行strophe javascript 表单字段:#jid ='admin @ localhost' 表单字段:#pass ='mypassword'
省略函数rawInput和rawOutput,它们只是记录传输的内容。
var BOSH_SERVICE=http://localhost:8080/xmpp-bosh
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='4005617322' xmlns='http://jabber.org/protocol/httpbind' to='localhost' 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'/>
RECV: <body xmlns='http://jabber.org/protocol/httpbind' authid='' condition='remote-stream-error' inactivity='600' polling='10' requests='2' secure='false' sid='orw55e6kuyZ0F-CFgnxXWMzG' type='terminate' wait='60'><starttls xmlns=''/><mechanisms xmlns=''><mechanism>DIGEST-MD5</mechanism><mechanism>PLAIN</mechanism><mechanism>CRAM-MD5</mechanism></mechanisms><compression xmlns=''><method>zlib</method></compression><auth xmlns=''/><register xmlns=''/></body>
Strophe failed to connect.
Strophe is disconnected.
任何想法如何克服这个问题? (已经使用pidgin IM进行测试并且有效)
答案 0 :(得分:0)
尝试启用Strophe调试以查看更多日志条目
Strophe.log = function(level, msg) {
console.log(level + ' : ' + msg);
};
然后检查Openfire的错误,警告甚至信息日志。
答案 1 :(得分:0)
您可以通过让Openfire开发人员修复他们的BOSH实现来克服这个问题。 (或者只是更新您的Openfire安装。)
服务器响应是错误的。
<body xmlns='http://jabber.org/protocol/httpbind' authid='' condition='remote-stream-error' inactivity='600' polling='10' requests='2' secure='false' sid='orw55e6kuyZ0F-CFgnxXWMzG' type='terminate' wait='60'>
<starttls xmlns=''/>
<mechanisms xmlns=''>
<mechanism>DIGEST-MD5</mechanism>
<mechanism>PLAIN</mechanism>
<mechanism>CRAM-MD5</mechanism>
</mechanisms>
<compression xmlns=''>
<method>zlib</method>
</compression>
<auth xmlns=''/>
<register xmlns=''/>
</body>
这些是body标签内的stream:features标签的内容。 body标签有type ='terminate',因此它告诉客户端关闭Strophe所做的连接。此外,缺少所有名称空间。
Openfire应该发送的内容是这样的:
<body xmlns='http://jabber.org/protocol/httpbind' xmlns:xmpp='urn:xmpp:xbosh' xmlns:stream='http://etherx.jabber.org/streams' sid='0630f9b79631f5ecb66d26313d34ce227262cf5d' wait='60' requests='2' inactivity='30' maxpause='120' polling='2' ver='1.8' from='localhost' secure='false' authid='2869001480' xmpp:version='1.0'>
<stream:features xmlns:stream='http://etherx.jabber.org/streams'>
<mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>
<mechanism>DIGEST-MD5</mechanism>
<mechanism>PLAIN</mechanism>
<mechanism>SCRAM-SHA-1</mechanism>
</mechanisms>
<compression xmlns=''>
<method>zlib</method>
</compression>
<register xmlns='http://jabber.org/features/iq-register'/>
</stream:features>
</body>
(stream:body标签内部的功能)。
tl; Dr StropheJS关闭连接是预期的行为,你的Openfire版本的BOSH插件可能已经坏了。