多个XMPP BOSH连接干扰Internet Explorer-更新:在其他浏览器中可以看到

多个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实例以从服务器接收数据。只有聊天

导言

我正在开发一个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聊天代码,可能相关,也可能无关,仅供参考:

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的。