【问题标题】:How to connect XMPP bosh server using java smack library?如何使用 java smack 库连接 XMPP bosh 服务器?
【发布时间】:2014-10-12 15:26:37
【问题描述】:

我有使用 strophe.js 在 webapp 上工作的 xmpp 客户端,根据我的用例场景,我必须快速切换到不同的页面

当前方法不安全,因为 jid 和密码在 java 脚本中可见,我正在寻找解决方法以在 strophe 客户端中实现安全性,并尝试缩短连接时间(使用 bosh),同时阅读“XMPP 编程”一书使用 JavaScript 和 jQuery”by jake moffitt 我遇到了一个解决方案,我的上述两个问题都是实现会话机制。它说我们可以使用 strophe attach(jid,sid,rid) 连接到现有连接,所以我需要SID 和 RID,我可以从应用服务器获取!!!

本书给出了用户登录 Web 应用程序时自动连接到 bosh 服务器的示例,作者使用 python 中的 Django 项目实现了它,因为我使用 java 作为服务器端语言,我尝试使用 java 实现相同的示例smcak-4.0.3 和 smack-bosh-4.0.3 但无法连接到 bosh 服务器(我使用 ejabberd 作为 xmpp 服务器)

我的代码如下

 BOSHConfiguration config = new BOSHConfiguration(false,"192.168.0.106",5280,"/http-bind/","192.168.0.106");
                XMPPBOSHConnection xbc=new XMPPBOSHConnection(config); 
                xbc.connect();
                xbc.login("admin", "admin");
                System.out.println(xbc.getConnectionID());

堆栈跟踪

java.lang.ClassNotFoundException: org.xmlpull.v1.XmlPullParserFactory
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1720)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571)
    at org.jivesoftware.smack.SmackConfiguration.processConfigFile(SmackConfiguration.java:352)
    at org.jivesoftware.smack.SmackConfiguration.processConfigFile(SmackConfiguration.java:347)
    at org.jivesoftware.smack.SmackConfiguration.<clinit>(SmackConfiguration.java:155)
    at org.jivesoftware.smack.ConnectionConfiguration.<init>(ConnectionConfiguration.java:67)

当我尝试登录 bosh 服务器时,每次都失败,我不确定这里出了什么问题,有人可以解释一下吗?

我发现的另一件事是可以使用“xbc.getConnectionID()”获取会话标识符(SID),但如何找到请求标识符?

对上述问题的任何帮助都将是可观的!!!!

提前致谢!

【问题讨论】:

    标签: java xmpp smack


    【解决方案1】:

    我遇到了类似的问题。 我下载所有 smack github 我从 /lib/ 导入 smack.jar 并从 /src/main/java/org/jivesoftware/smack/ 添加 3 个 java 文件

    我尝试通过从 /target/ 导入 smack-bosh-3.2.2-jar-with-dependencies.jar 来修复它。我不知道为什么这不起作用。

    最后,我读到 here 你需要下载所有依赖库: jbosh-0.6.0.jar xlightweb-2.5.jar xSocket-2.4.6.jar xpp3-1.1.3.3.jar dom4j-1.6.1.jar

    所以我将 /lib/ 中的 smack.jar 与所有这些库一起使用,这个问题就解决了。

    正如我在 cmets 中所说,您需要在获取 RID 之后。我使用了 jbosh 源并添加了以下几行:

    In com.kenai.jbosh.BOSHClient class
    //I introduced a new property
    private Long rid;
    
    //commented the following code
    //long rid = requestIDSeq.getNextRID();
    //and at that place added
    this.rid = requestIDSeq.getNextRID();
    
    //and finally added a new getter for rid
    public Long getRid() {
        return rid;}
    

    然后在 smack-bosh 中:

    In BOSHConnection.java
    public Long getRid() {
        return client.getRid();}
    public String getSid() {
        return sessionID;}
    

    现在我被阻止了,因为我的会话已断开。根据我的 openFire 日志,这是因为活动过度。所以我正在寻找一种解决方案来减少在线消息的数量。

    【讨论】:

    • 谢谢你的回答,能不能把你的代码分享给我,对我很有帮助!!!
    • 嘿,它现在可以工作了,但仍然存在一个问题是我能够获得 SID 但没有 RID,你能告诉我如何获得 RID(请求标识符)???
    • 嗨,回答上面的“我还有一个问题......”(最好作为一个单独的问题!)。您需要注意 SID 是“会话 ID”-因此从服务器连接然后传递给 attach() 是在两个 http“会话”中使用相同 XMPP 会话的技巧-直到之后才能关闭服务器上的连接您已附加 - 否则会话在附加之前在 XMPP 服务器中被清理(我认为)。请参阅stackoverflow.com/a/23287076/1265200 - 我还必须更改代码以停止在服务器连接上发出存在节。
    • 对于 .jar,我将 jbosh 源代码放入我的项目中,然后通过自动编译检索我在 winrar 的原始 jbosh.jar 中引入的 .class。同意 Dazed 的“剩下一个问题”,否则会一团糟。 Dazed,你能把你的最后一句话说清楚吗?
    • @user3523641 我不知道为什么它直接运行良好,尝试只导入修改后的 .class (以保留大部分原始代码)并确保导入所有.class 的一部分已修改:我注意到 BOSHClient 有 3 个 .class 原始的一个和另外 2 个,最后是 $1 和 $2。但是我暂时没有看到具体的原因,如果我找到了,我会告诉你。
    【解决方案2】:

    要获得 Android BOSH 的最新优势,您需要 Smack 版本 4.1.1

    SMACK --- smack-tcp smack-sasl-provided smack-resolver-minidns smack-resolver-dnsjava smack-extensions smack-core smack-bosh smack-android-extensions smack-android

    你还需要

    XPP3 1.1.4c 从 android 的 JAR 文件中删除 javax 包,因为 android 已经有 javax....QName 类

    JXMMP、JXMMP 缓存、JBOSH、MINIDNS、DNSJAVA、JSTUN、XBILL DNS

    不需要 Apache HTTP 客户端,它已经在 android 中可用

    不幸的是,它大约有 12 个 JAR 文件, 在 Eclipse 中更好地使用 Maven Android 项目

    否则在 Maven Central http://search.maven.org/#search 搜索以上关键字,并一一获取 JAR 文件

    【讨论】:

    • 我已经从 smack-bosh 中删除了 SaslException。下一个版本现在应该可以在 Android 上运行而无需修改。如果您已向 Smack 社区论坛报告此问题,我可能会更早将其删除。另请注意,不需要 jstun 和 xbilldns (dnsjava)。
    【解决方案3】:

    堆栈跟踪

    java.lang.ClassNotFoundException: org.xmlpull.v1.XmlPullParserFactory
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1720)
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571)
        at org.jivesoftware.smack.SmackConfiguration.processConfigFile(SmackConfiguration.java:352)
        at org.jivesoftware.smack.SmackConfiguration.processConfigFile(SmackConfiguration.java:347)
        at org.jivesoftware.smack.SmackConfiguration.<clinit>(SmackConfiguration.java:155)
        at org.jivesoftware.smack.ConnectionConfiguration.<init>(ConnectionConfiguration.java:67)
    

    这里的异常明确指出Webapp 找不到类org.xmlpull.v1.XmlPullParserFactory。听起来您的类路径中缺少xml-apis 库,(或XmlPullParser 接口的其他一些实现)。

    【讨论】:

    • 感谢您的回答,正如@Deuteu 所提到的,我没有包含 xlightweb-2.5.jar 以便我解决问题。
    猜你喜欢
    • 2023-03-24
    • 2012-12-28
    • 2016-11-05
    • 2012-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多