可以使用 Strophe 在 java(jvm) 上与 Bosh Manager 建立 Bosh 连接吗?

Posted

技术标签:

【中文标题】可以使用 Strophe 在 java(jvm) 上与 Bosh Manager 建立 Bosh 连接吗?【英文标题】:Can Strophe be used to make an Bosh Connection with Bosh Manager on java(jvm)? 【发布时间】:2014-08-20 19:23:49 【问题描述】:

我有一个使用 strophe 的工作 xmpp Web 客户端,我目前的方法是在 java 脚本上从 strophe 登录用户,但从安全角度来看它并不安全,并且在我的应用程序中我必须快速切换页面, 在互联网上搜索 SO 时,我发现 Jake Moffitt 提供了一种实现会话的解决方案,克服了这两个限制,正如他在“使用 java 脚本的专业 xmpp”一书中提到的那样,可以轻松实现会话并在服务器上获取 SID 和 RID [有从服务器创建 xmpp bosh 连接]并将其传递给 java 脚本(jid、sid 和 rid),然后在 attach() 方法中使用它来连接 xmpp bosh 管理器,

我使用 java 作为服务器端语言,虽然有人尝试在 java 中实现 boshclient,但似乎 java smack 和 jbosh 是唯一可用的解决方案(我的意思是工作解决方案), 但是我找不到任何可以使用 java 脚本获取 RID 和 SID 的方法,我通过了另一种方法

为什么不在 jvm 上运行 strophe 客户端,(为什么要在 jvm 上运行 strophe?我可以在 java 脚本上使用 strophe 摆脱和 sid,正如 link 中提到的那样,为什么应该在 java 上尝试这个解决方案) 我已将 rihno 包含在我的动态 Web 项目 js.jar 到 WebContent/WEBINF/lib 中的 lib 文件夹中,并提供了运行 env.rihno.js 的合格路径,该路径在 java 上创建浏览器运行时并包含 strophe.js 和 jquey .js 文件并尝试连接到 bosh clint,就像我在 javascript 上为我的 Web 应用程序所做的那样,

代码::

Context cx = ContextFactory.getGlobal().enterContext();
            cx.setOptimizationLevel(-1);
            cx.setLanguageVersion(Context.VERSION_1_5);
            Global global = Main.getGlobal();
            global.init(cx);
            Main.processSource(cx, "/home/devwrat/workspace/Test/env.rhino.1.2.js");
            Main.processSource(cx, "/home/devwrat/workspace/Test/jquery-1.11.1.js");
            Main.processSource(cx, "/home/devwrat/workspace/Test/strophe.js");
            Main.processSource(cx, "/home/devwrat/workspace/Test/boshconnection.js");

在我的 java 脚本中使用 strophe 执行 cinnection.connect() 之前,在 java 上似乎一切正常,我观察到它没有连接到 bosh 管理器。

我的问题如下 是否可以在 java 中使用 strophe 建立 bosh 连接?是的,如何?

提前谢谢!!!!

编辑 (21-8-2014):: 我观察到执行 conn.connect(Arthur.jid, Arthur.password, function (status)print(status);) 后,status 为 1,这反过来意味着连接状态正在连接,它总是说连接永远不会连接? ?可能是xmpp bosh manager没有验证连接!!!

【问题讨论】:

【参考方案1】:

Strophe.js 通常与客户端 javascript 一起使用。我认为您尝试在服务器端运行 Strophe.js 会增加不必要的复杂性。

您提到了两个不同的问题,将身份验证移至服务器端,以及在页面更改之间维护会话。

问题 #1 将身份验证移至服务器端(预绑定)

如果您想将登录过程移动到服务器端,那么您可以通过使用基于 java 的 XMPP 库或手动创建和发送节来实现(这并不难,基本上只是发送 XML HTTP),这是身份验证过程所需的。一旦 BOSH 会话在服务器端建立,会话的 JID+RID+SID 属性就可以传递给客户端 javascript 并由 Strophe 的attach() 使用。

为了编写您自己的 BOSH 预绑定器,您应该首先检查 Strophe 和 ejabberd 之间交换的节,还应该阅读 XEP-206。总之,您需要创建某种 HTTPClient,将其指向 ejabberd 的 /http-bind/ 地址,然后开始向它发送与 strophe 在登录期间发送的相同消息。您始终可以使用浏览器的网络调试器或 Fiddler2(我推荐这个)检查消息(节)。一旦您了解了 Strophe 如何建立会话,您就可以开始编写自己的服务器端机制来建立会话。在服务器端建立会话后,您可以提取 SID+RID+JID,并将它们发送到您的页面并与attach() 一起使用。

问题 #2 在页面更改之间维护会话

您陈述的第二个问题是您的应用程序经常更改页面。如果你想实现一种机制来维护页面更改之间的 XMPP 会话,这可以通过使用 strophes attach() 结合存储 JID+RID+SID 的机制来完成。我结合使用 LocalStorage 和 AJAX 的回退来实现这一点。

BOSH 和 XMPP

您无法从许多 XMPP 库中提取 RID 和 SID 值的原因是它们不使用这些属性。 SID 和 RID 与 BOSH 一起使用,这使我们能够使用 HTTP 与 XMPP 服务器进行通信。对于使用 BOSH 与 XMPP 服务器通信的 Web 应用程序,我们有 3 个级别:XMPP 服务器本身、BOSH 连接管理器和 Web 应用程序。由于 HTTP 是无状态的,而 XMPP 不是(它旨在维持持久连接),我们需要使用 BOSH 连接管理器来维持与 XMPP 服务器的持久连接。这个连接管理器负责管理我们与服务器的会话并处理来自 Web 应用程序的间歇性请求,它能够使用Comet 将消息推送到客户端。

为了让 BOSH 连接管理器验证来自 Web 应用程序的间歇性请求,我们在每个节中包含一个 SID 和一个 RID 属性。 SID 将在会话的生命周期内保持不变,并且 RID 将随着每个传出请求增加 1。正确递增 RID 很重要,如果将带有意外 RID 的请求发送到连接管理器,会话通常会结束并且连接管理器将返回错误。

希望对您有所帮助。

【讨论】:

感谢@fpsColton 的回答,是的,我尝试使用 java 库 smack 和 jbosh 与 xmpp bosh 管理器连接,但我无法提取 sid 和 rid ,你能帮我吗?这样做我们在 java smack 中没有可用的方法来提取 sid ad rid!!!1 您能否详细说明“如何从 java 手动创建节并将其发送到 jabberd 服务器”,是否有可用的示例代码? 我还发现许多可用于应用程序开发的 XMPP 库不支持 BOSH,因为 BOSH 主要用于我们不能直接使用 XMPP(我们需要 HTTP)时。既然是这样,SID 和 RID 就找不到了。这是 smack 的扩展,它启用了 BOSH github.com/eriksson/smack-bosh,尽管我不确定它是否会公开底层 RID 和 SID。 为了编写自己的 BOSH 预绑定器,您可以检查 Strophe 和 ejabberd 之间交换的节以查看交换了哪些信息,您还应该阅读此xmpp.org/extensions/xep-0206.html#initiate。总之,您将需要创建某种 HTTPClient,将其指向 ejabberd 的 /http-bind/ 地址,然后开始向其发送与 strophe 在登录期间发送的相同消息。您始终可以使用浏览器的网络调试器或 Fiddler2(我推荐这个)检查消息(节)。 @fpsColton 感谢您的回答,正如您所说,我已经使用了这个库(github.com/eriksson/smack-bosh)并且能够建立 bosh 连接,但我无法提取 rid 和 sid从中,我可以提取摆脱,但根据我的观察,当我启用 smack 调试器以观察网络流量时,它是一个数字序列,我能够查看通过网络发送的 xmpp 节(xml),现在我正在使用 sid java代码与我在调试器输出中观察到的不同!!!!现在我有一些疑问希望你能尝试解决它,1>>你能告诉我什么

以上是关于可以使用 Strophe 在 java(jvm) 上与 Bosh Manager 建立 Bosh 连接吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 strophe 在 xmpp 中传输文件

使用 strophe js 在聊天中发送图像

使用 Strophe.js 名册插件和 Ejabberd 接收“订阅”状态

strophe 无法通过 websocket 连接 openfire

使用 strophe.js 在 eJabberd 服务器上获取具有名称的特定花名册

使用 Strophe 连接到 ejabberd 的 AUTHFAIL 和会话超时