在 android 上尝试使用 smack 连接 openfire 时出错

Error while trying to connect openfire using smack on android

XMPPTCPConnectionConfiguration.Builder configBuilder =  XMPPTCPConnectionConfiguration.builder();
    configBuilder.setUsernameAndPassword("test", "test");
    configBuilder.setResource("test");
    configBuilder.setServiceName("37.139.26.142");
    configBuilder.setHost("37.139.26.142");
    configBuilder.setPort(5222);
    configBuilder.setSendPresence(true);
    configBuilder.setDebuggerEnabled(true);
    configBuilder.setSecurityMode(XMPPTCPConnectionConfiguration.SecurityMode.required );
    SASLMechanism mechanism = new SASLDigestMD5Mechanism();
    SASLAuthentication.registerSASLMechanism(mechanism);
    SASLAuthentication.blacklistSASLMechanism("SCRAM-SHA-1");
    SASLAuthentication.unBlacklistSASLMechanism("DIGEST-MD5");
    AbstractXMPPConnection connection = new XMPPTCPConnection(configBuilder.build());
    try {
        connection.connect();
    } catch (SmackException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (XMPPException e) {
        e.printStackTrace();
    }
    try {
        connection.login();
    } catch (XMPPException e) {
        e.printStackTrace();
    } catch (SmackException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

我目前正在尝试握手我的 android 应用程序和我的 openfire 服务器(在 ubuntu 上工作)。但我做不到。我没有遇到任何失败或其他问题。只是什么也没发生。那感觉很糟糕。

您尝试发送消息了吗?你确定你没有连接? 您是否检查过 Openfire 管理员您的测试用户未连接?

首先建议您尝试发送消息:

ChatManager chatmanager = ChatManager.getInstanceFor(connection);
Chat newChat = chatmanager.createChat("anotheruser@yourdomain", new MessageListener() {
    public void processMessage(Chat chat, Message message) {
        System.out.println("Received message: " + message);
    }
});

try {
    newChat.sendMessage("Howdy!");
}
catch (XMPPException e) {
    System.out.println("Error Delivering block");
}

我从以下位置获得此代码:http://www.igniterealtime.org/builds/smack/docs/latest/documentation/messaging.html

另一个建议是关闭SecurityMode,只是为了测试。

configBuilder.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);

如果这些都不起作用,请尝试使用以下适合我的配置。

XMPPTCPConnectionConfiguration.Builder config = XMPPTCPConnectionConfiguration.builder();

config.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);
config.setServiceName(serverAddress);
config.setHost(serverAddress);
config.setPort(5222);
config.setDebuggerEnabled(true);
connection = new XMPPTCPConnection(config.build());

try {
    connection.connect();
} catch (SmackException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
} catch (XMPPException e) {
    e.printStackTrace();
}
try {
    connection.login(loginUser, passwordUser);
} catch (XMPPException e) {
    e.printStackTrace();
} catch (SmackException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

首先我发现这不是关于 Android 的部分,这是关于 Openfire 的部分。因为我无法将它与 Spark 连接,所以我在 Logcat;

中看到了这个
W/System.err: org.jivesoftware.smack.SmackException$ConnectionException: The following addresses failed: '37.139.26.142:5222' failed because java.net.SocketTimeoutException: failed to connect to /37.139.26.142 (port 5222) after 30000ms

然后我做了一些研究并尝试了一些东西,我发现它大约是 Ubuntu(至少对我而言)。然后我把我的openfire服务器搬到了Centos。然后我就可以用 Spark 连接到它了。然后我遇到了另一个问题。

org.jivesoftware.smack.SmackException: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.

我用下面的代码解决了这个问题。我希望这可以帮助其他人。

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);    

        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);

        SmackConfiguration.DEBUG = true;
        XMPPTCPConnectionConfiguration.Builder configBuilder = XMPPTCPConnectionConfiguration.builder();
        configBuilder.setUsernameAndPassword("test", "test");
        configBuilder.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);
        configBuilder.setResource("test");
        configBuilder.setServiceName("enter your server ip here");
        configBuilder.setHost("eneter your server ip here");
        configBuilder.setPort(5222);
        configBuilder.setSendPresence(true);
        configBuilder.setDebuggerEnabled(true);
        SASLAuthentication.blacklistSASLMechanism("SCRAM-SHA-1");
        SASLAuthentication.blacklistSASLMechanism("DIGEST-MD5");
        SASLAuthentication.unBlacklistSASLMechanism("PLAIN");

        XMPPTCPConnection connection;
        connection = new XMPPTCPConnection(configBuilder.build());
        // Connect to the server
        try {
            connection.connect();
        } catch (SmackException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (XMPPException e) {
            e.printStackTrace();
        }
        // Log into the server

        try {
            connection.login();
        } catch (XMPPException e) {
            e.printStackTrace();
        } catch (SmackException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}