【问题标题】:Java - trying to prebind converse.js using bosh but not able to get the sid and rid...using the smack boshJava - 尝试使用 bosh 预绑定 converse.js 但无法获得 sid 并摆脱...使用 smack bosh
【发布时间】:2014-06-09 11:43:04
【问题描述】:

我正在尝试使用 smack bosh 连接到明火,并尝试在网页中预绑定 converse.js。我的 bosh 代码

BOSHConfiguration config = new BOSHConfiguration(false, "host", 7070, "/http-bind/", "<host>", "xmpp:127.0.0.1:5222");
BOSHConnection connection = new BOSHConnection(config);
try {
connection.connect();
connection.login("un", "pw");
String sss = connection.getConnectionID();
String bosh = connection.BOSH_URI;
} catch (Exception e) {
}

谁能帮助我如何建立一个 bosh 连接并从会话中获取所需的 sid、rid 和 jid....

非常感谢任何帮助。

【问题讨论】:

  • 你在这里使用什么库(意思是smack.versionX.jar)你在这里使用什么??

标签: java xmpp smack converse.js


【解决方案1】:

我设法通过在 Smack BOSHConnection 库类中添加以下函数来做到这一点:

public class BOSHConnection extends Connection {
    ...
    public String getSid() {
        return client.getSid();
    }

    public Long getRid() {
        return client.getRid();
    }
    ...
}

然后,您需要记住 Rid 是 Smack 库使用的最后一个 id,对于您的预绑定,您需要为下一个请求增加它。

Jid 已经可以通过 BOSHConnection.getUser();

我还应该指出,要让 converse pre-bind 与 Smack 一起工作,我还必须更改 BOSHConnection.login 函数。

// Changed: preserve current api - call new pre-bind aware function
public void login(String username, String password, String resource)
        throws XMPPException {
    login(username, password, resource, false);         

}

// Added: Using original login function with prebind awareness
public void login(String username, String password, String resource, boolean preBind)         
        throws XMPPException {
    if (!isConnected()) {
        throw new IllegalStateException("Not connected to server.");
    }

    ... unchanged

    // Indicate that we're now authenticated.
    authenticated = true;
    anonymous = false;

    // Added: Prebind only requires connect and authenticate
    if (preBind) {
        return;
    }

然后在网络应用中

// login with pre-bind only
connection.login(userName, password, "", true);

这是必需的,因为 converse 所做的第一件事是执行登录功能后半部分所做的所有花名册和出席信息。我的理由是 XMPP 服务器实际上会看到两个连接(一个来自 SMACK,一个来自 converse),它是发送出席信息的连接,最终将成为 XMPP 消息的目标 - 我们希望它是相反的。

编辑:更长的代码示例是in this other StackOverflow answer

【讨论】:

  • 您能否也展示一下您的 client.getSid() 和 client.getRid() 的样子。
  • @Ulik “client”变量不是我添加的,这是 Smack BOSHConnection 类中现有的私有变量 (BOSHClient)。这些函数只是允许访问内部 id。
  • 你这里用的是什么版本的smack,smack-core-4.0.3.jar和smack-bosh-4.0.3.jar,但是连服务器都登不上去,能告诉下吗我用什么库(.jar 文件)来运行上面的代码!!!!
  • 嗨,我使用的是 3.2.2,这与 @Deuteu 的答案中的 linke 相同 - 看起来你现在已经编译了东西。
【解决方案2】:

我已经给了这个提示here,显然它对他有用,所以这里是:

我也无权访问 client.getRid/Sid。我检查了 jbosh 源,发现这些方法不存在,所以我不得不添加它们。

我使用了 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;}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    • 2015-05-29
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 2023-03-29
    相关资源
    最近更新 更多