多个XMPP BOSH连接干扰Internet Explorer-更新:在其他浏览器中可以看到
导言 我正在开发一个MVC web应用程序,它使用XMPP有两个目的: 1) 将实时数据从服务器传送到客户端-XMPPMessaging 2) 用户组聊天-XMPPChat 我在客户端使用Strophe.js,在服务器端使用MatriX C#library。XMPPChat是通过在服务器端预绑定并将连接信息传递给客户端(与strophe连接)来设置的。XMPPMessaging不是预绑定,只是在客户端登录。用户打开的每个窗口都连接一个新的XMPPMessaging实例以从服务器接收数据。只有聊天窗口连接XMPPChat和XMPPMessaging。此外,两者都通过BOSH连接到Punjab连接管理器,后者将消息转发到Openfire服务器 问题 目前,我有一个问题只在InternetExplorer中出现(我正在用IE8和IE9进行测试,这两个问题都存在)。当我连接了XMPPMessaging和XMPPChat时,聊天信息会在非常大的延迟(10秒-2分钟)后发送。我也看到过这会导致XMPPChat的断开问题。接收功能非常有效;如果有任何其他浏览器向聊天室发帖(即与其他人一样立即收到)。当XMPPMessaging关闭时,聊天发送运行良好,没有延迟或断开连接。我已经用断点逐步完成了代码,发送功能立即启动。我还观察了Punjab的日志,似乎Punjab直到延迟之后才收到消息,并且正在很好地传递它们(其他浏览器工作正常也证明了这一点) 我最想知道的是,是否有人见过像这样的问题,在IE中同时出现波什连接 更新 IE中的聊天功能今天就开始工作了,完全令人费解;我根本没有更改代码或它的任何配置。我仔细检查了消息连接和聊天连接是否都在运行,并且都已连接。在尝试诊断修复时,我重新启动了Apache,bug又回来了,只是在IE中,我们看到聊天速度明显减慢,并且随机断开连接 更新2-可在其他浏览器中看到 今天,我可以在其他浏览器(Chrome、Firefox)中通过在其他选项卡中打开多个聊天实例来重现这个问题。因此,IE似乎只受到了更严重的问题-只需要打开一个标签。这将我引向浏览器并发连接限制的问题,但考虑到我不应该接近2个连接的限制,这也没有意义 更新3-在其他浏览器中确定原因 我在Firefox中执行了一个测试,以确认我的怀疑,即我们正在处理并发连接问题。我打开一个聊天标签,即时发布消息。我打开了第二个,果然,他们耽搁了。然后我打开了about:config,并将network.http.max-persistent-connections-per-server从6改为7。做了这件事之后,我重复了测试。我能够在第一个和第二个聊天标签中即时发布消息,但当我打开第三个标签时,它们都开始出现延迟。我将尝试在IE中进行测试,通过修改FEATURE_MAXCONNECTIONSPERSERVER注册表设置并查看问题是否消失,看看这是否是相同的问题 更新4-IE问题仍未解决 我在IE中执行了相同的测试,如图所示更改注册表,将iexplorer.exe DWORD设置添加到设置为0xA的FEATURE_MAXCONNECTIONSPERSERVER和FEATURE_MAXCONNECTIONSPER1_0SERVER注册表中,但没有明显的行为更改。我用x64设置(在Wow6432Node下)尝试了同样的方法,但仍然没有发现任何变化。我还尝试将原始explorer.exe值从2或4更改为8,但在每次更改后重新启动计算机后,仍然没有看到任何行为变化 代码 以下是我的一些XMPP聊天代码,可能相关,也可能无关,仅供参考:多个XMPP BOSH连接干扰Internet Explorer-更新:在其他浏览器中可以看到,xmpp,delay,strophe,two-connection-limit,Xmpp,Delay,Strophe,Two Connection Limit,导言 我正在开发一个MVC web应用程序,它使用XMPP有两个目的: 1) 将实时数据从服务器传送到客户端-XMPPMessaging 2) 用户组聊天-XMPPChat 我在客户端使用Strophe.js,在服务器端使用MatriX C#library。XMPPChat是通过在服务器端预绑定并将连接信息传递给客户端(与strophe连接)来设置的。XMPPMessaging不是预绑定,只是在客户端登录。用户打开的每个窗口都连接一个新的XMPPMessaging实例以从服务器接收数据。只有聊天
XMPPAttach: function (jid, sid, rid) {
connection = new Strophe.Connection(BOSH_SERVICE);
connection.rawInput = function (data) {
log('RECV: ' + data);
};
connection.rawOutput = function (data) {
log('SENT: ' + data);
};
MY_JID = jid;
connection.addHandler(notifyUser, null, 'message', 'chat', null, null);
connection.addHandler(groupChat, null, 'message', 'groupchat', null, null);
connection.addHandler(presenceInfo, null, 'presence', null, null, null);
connection.ping.addPingHandler(pingHandler);
connection.attach(jid, sid, rid, onConnect, 300);
}
function onConnect(status) {
switch (status) {
case Strophe.Status.CONNECTED:
log('CONNECTED');
break;
case Strophe.Status.ERROR:
log('ERROR');
break;
case Strophe.Status.CONNFAIL:
log('CONNFAIL');
break;
case Strophe.Status.AUTHENTICATING:
log('AUTHENTICATING');
break;
case Strophe.Status.AUTHFAIL:
log('AUTHFAIL');
break;
case Strophe.Status.CONNECTING:
log('CONNECTING');
break;
case Strophe.Status.DISCONNECTED:
log('DISCONNECTED');
break;
case Strophe.Status.DISCONNECTING:
log('DISCONNECTING');
break;
case Strophe.Status.ATTACHED:
log('ATTACHED');
break;
default:
log('UKNOWN STATUS CODE');
break;
}
if ((status == Strophe.Status.CONNECTED || status == Strophe.Status.ATTACHED) && !presenceSent) {
connection.send($pres().tree());
presenceSent = true;
userLogin();
}
else if (status == Strophe.Status.CONNECTING || status == Strophe.Status.AUTHENTICATING) {
// do nothing
}
else if (status == Strophe.Status.AUTHFAIL) {
userInvalidLogin();
}
else {
userLoginFailed();
}
}
EnterChatRoom: function (room, nick) {
ROOM_JID = room;
MY_NICK = nick;
var chatJID = room.concat('/', nick);
var pres = $pres({ to: chatJID }).c('x', { xmlns: 'http://jabber.org/protocol/muc' });
connection.send(pres);
}
SendToRoom: function (text) {
var send = $msg({ to: ROOM_JID, type: 'groupchat' }).c('body', {}, text);
connection.send(send.tree());
},
下面是我的一些XMPP消息传递代码:
function initializeXMPP() {
connection = new Strophe.Connection(BOSH_SERVICE);
intentionalDisconnect = false;
connection.rawInput = function (data) {
log('RECV: ' + data);
};
connection.rawOutput = function (data) {
log('SENT: ' + data);
};
connection.addHandler(onMessage, null, 'message', null, null, null);
connection.ping.addPingHandler(pingHandler);
connection.connect(messageCatcher.serverSettings.clientUser + '@' + messageCatcher.serverSettings.xmppDomain,
messageCatcher.serverSettings.clientUserPassword,
onConnect, 300, undefined, messageCatcher.serverSettings.route);
log('Strophe is connected.');
}
function onConnect(status) {
switch (status) {
case Strophe.Status.ERROR: // 0
log('ERROR');
StandardErrorHandler({ "Message": "XMPP Connection Error", "Status": "ERROR" });
break;
case Strophe.Status.CONNECTING: // 1
log('CONNECTING');
break;
case Strophe.Status.CONNFAIL: // 2
log('CONNFAIL');
StandardErrorHandler({ "Message": "XMPP Connection Error", "Status": "CONNFAIL" });
break;
case Strophe.Status.AUTHENTICATING: // 3
log('AUTHENTICATING');
break;
case Strophe.Status.AUTHFAIL: // 4
log('AUTHFAIL');
StandardErrorHandler("XMPP AUTHFAIL");
break;
case Strophe.Status.CONNECTED: // 5
log('CONNECTED');
callHandlers(connectHandlers);
break;
case Strophe.Status.DISCONNECTED: // 6
log('DISCONNECTED');
onDisconnect();
break;
case Strophe.Status.DISCONNECTING: // 7
log('DISCONNECTING');
break;
case Strophe.Status.ATTACHED: // 8
log('ATTACHED');
break;
default:
log('UKNOWN STATUS CODE');
break;
}
if (status == Strophe.Status.CONNECTED && !presenceSent) {
var pres = $pres({
//type: 'available'
});
connection.send(pres);
presenceSent = true;
log("PRESENCE SENT - SID: " + connection.sid);
}
}
我正试图在我的一个项目中实现类似的东西。你能分享你的MVC代码吗?我想知道您是如何在服务器端获取jid、sid和rid并将其传递给strophe的。我正在尝试在我的一个项目中实现类似的功能。你能分享你的MVC代码吗?我想知道你们是如何在服务器端获得jid、sid和rid并将其传递给strophe的。