Strophe + Openfire 连接反复断开

Posted

技术标签:

【中文标题】Strophe + Openfire 连接反复断开【英文标题】:Strophe + Openfire connection disconnected repeatedly 【发布时间】:2014-11-07 07:03:26 【问题描述】:

我正在使用 Openfire 3.9.3 并使用 strope.js 创建了网络聊天应用程序。当 openfire 上的用户数量较少时,连接是稳定的。但是有很多用户在该应用程序上注册。 用户不在线仍然我的连接反复断开我再次连接on_disconnected()。连接已建立,但再次断开连接

NetworkError: 404 Invalid SID. - http://127.0.0.1:7070/http-bind/

是客户端缺陷还是服务器端缺陷? 如何解决这个问题?

【问题讨论】:

【参考方案1】:

Openfire 通常会定期 ping 客户端以检查客户端是否处于活动状态。当客户端在指定的超时时间内未能响应时,服务器会推断客户端已断开连接。

您得到的错误是找不到页面错误,这基本上意味着您的侦听端口或网络存在问题。

但是由于您使用的是环回地址,因此排除了网络可能性。检查您的服务器端口,因为我(即使代码未提供参考)觉得您的客户端可能没有任何问题。只需确保绑定地址正确无误。

【讨论】:

如果我将服务器从 Openfire 更改为 Erlang 会解决这个问题吗? 我建议您先尝试在 Openfire 管理控制台中更改 ping 间隔设置,因为我使用过 Openfire 并且效果很好。 我尝试了从默认的 360 秒到 5 秒、10 秒、15 秒,但仍然出现同样的错误! 您是否定期发布您的存在?因为不正确的节也会导致与服务器断开连接。检查存在节构建器参数,因为我认为这不是 Openfire 问题。 谢谢你,但是Openfire的设置还有一个缺陷,总之解决了这个问题。【参考方案2】:

我的代码中遇到了同样的问题(我正在使用我的 Candy Chat 版本),问题是我没有及时调用 _doDisconnectBOSH _proto 版本。

_doDisconnect: function ()
    
        this.sid = null;
        this.rid = Math.floor(Math.random() * 4294967295);
        window.sessionStorage.removeItem('strophe-bosh-session');
    ,

您必须确保在您的代码调用 Strophe _changeConnectStatus 函数以断开连接之前调用它。或者至少设置当前连接this.sid = null

换句话说,您必须确保 Strophe 将当前的“sid”值设为空,以便下一次 ping 不发送“sid”或新的(我认为没有,但可能是新的)。如果没有,即使服务器现在断开连接,您的客户端下一个“发送”ping 也会包含旧值。然后服务器给出信息量不大的 404 错误,这实际上是让您知道该连接不再有效(这当然是我首先想要的)。有点像先有鸡还是先有蛋的问题。

希望对为什么出现该错误的一个版本有所帮助。标准版的 Candy Chat 会在每次尝试连接之前重置所有内容,因此不存在此问题。

【讨论】:

【参考方案3】:

在客户端更新 keepalive 值。默认为 120 秒。

【讨论】:

以上是关于Strophe + Openfire 连接反复断开的主要内容,如果未能解决你的问题,请参考以下文章

strophe 无法通过 websocket 连接 openfire

Strophe 与 bosh 和 openfire 的连接错误

如何检测与 Strophe.js 断开的会话?

当用户同一用户多次登录时,strophe.js 不调用断开连接

Strophe javascript 防止在某些延迟时断开连接

通过 Bosh 进行的 Openfire 带内注册无法与 Strophe/Strophe.register.js 一起使用