如何使用java smack库连接XMPP bosh服务器?

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

当前的方法并不安全,因为jid和密码在java脚本中是可见的,我正在寻找解决方案来实现安全性,尝试使连接时间(与bosh)更短,同时阅读“使用JavaScript和XMPP编程”一书jQuery“通过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.(SmackConfiguration.java:155) at org.jivesoftware.smack.ConnectionConfiguration.(ConnectionConfiguration.java:67) 

当我试图登录到波什服务器时,它每次都会失败,我不确定这里有什么问题可以解释一下吗?

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

任何有关上述问题的帮助都是适合的!

提前致谢!

我有类似的问题。 我从/ lib /导入smack.jar,然后添加来自/ src / main / java / org / jivesoftware / smack /的3个java文件

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

最后,我在这里读到你需要下载所有的依赖库: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和所有的库,这个问题就解决了。

正如我在评论中所说的那样,你需要追踪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日志,这是因为过度活跃。 所以我正在寻找一种减少在线消息数量的解决方案。

要获得Android BOSH的最新优势,您需要Smack Releases 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 CACHE,JBOSH,MINIDNS,DNSJAVA,JSTUN,XBILL DNS

不需要已在android中提供的Apache HTTP Client

不幸的是它出现了大约12个JAR文件,更好地在Eclipse中使用Maven Android Project

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

堆栈跟踪

 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.(SmackConfiguration.java:155) at org.jivesoftware.smack.ConnectionConfiguration.(ConnectionConfiguration.java:67) 

这里的例外清楚地表明Webapp无法找到类org.xmlpull.v1.XmlPullParserFactory 。 听起来你在类路径中缺少xml-apis库(或者XmlPullParser接口的其他一些实现)。