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

时间:2014-08-19 13:40:29

标签: java xmpp smack

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

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

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

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

对上述问题的任何帮助都会很有用!!!!

提前谢谢!

3 个答案:

答案 0 :(得分:4)

我有类似的问题。 我从/ lib /下载所有smack github我导入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和所有的库,这个问题就解决了。

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

答案 1 :(得分:3)

要获得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 class

JXMMP,JXMMP CACHE,JBOSH,MINIDNS,DNSJAVA,JSTUN,XBILL DNS

不需要已在android

中提供的Apache HTTP客户端

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

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

答案 2 :(得分:1)

  

堆栈跟踪

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接口的其他一些实现)。