Java - 尝试使用bosh预绑定converse.js但是无法获得sid并且摆脱...使用smack bosh

时间:2014-04-24 09:15:09

标签: java xmpp smack bosh converse.js

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

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) {
}

有人可以帮助我建立一个波什连接并从会话中获取所需的sid,rid和jid ....

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:4)

我设法通过在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();

获得

我还应该标记为了使用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;
    }

然后在Web应用程序中

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

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

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

答案 1 :(得分:1)

我已经给出了这个提示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;}