我使用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状态???
答案 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是火虫创建者自己的教程。