【发布时间】:2021-10-22 14:16:34
【问题描述】:
我正在尝试使用 XMPP over WebSockets 在我的 Android 应用中实现聊天功能。
我能够找到一个库 (org.igniterealtime.smack),但连接是通过 TCP 而不是通过 WebSockets 建立的,这是我不想要的。
是否有人必须实现相同的功能并且可以为我指明正确的方向?
【问题讨论】:
我正在尝试使用 XMPP over WebSockets 在我的 Android 应用中实现聊天功能。
我能够找到一个库 (org.igniterealtime.smack),但连接是通过 TCP 而不是通过 WebSockets 建立的,这是我不想要的。
是否有人必须实现相同的功能并且可以为我指明正确的方向?
【问题讨论】:
对 Smack 的 Websocket 支持跟踪为 SMACK-835。它目前位于 Smack 的主分支中,并计划成为 Smack 4.5 版本。
您现在可以通过使用 Smack 预发布版本或来自 https://www.igniterealtime.org/archiva/repository/maven/ 的夜间工件来使用它
【讨论】:
不确定它是否可以并且不违反 TOS 之类的,但第一句话暗示了 XMPP + WebSocket 的一般指导,而不是严格要求 Smack 答案所以 - 你可以使用已经支持 WebSocket 的 JaXMPP 库 (https://github.com/tigase/jaxmpp)并且与Android兼容(StorkIM,https://github.com/tigase/stork是基于它的)。
建立 WebSocket 连接非常容易(即使是加密的):
JID user = JID.jidInstance("user@example.com/resource");
String password = "password";
Jaxmpp contact = new Jaxmpp();
contact.getModulesManager().register(new MessageModule());
contact.getConnectionConfiguration().setConnectionType(ConnectionConfiguration.ConnectionType.websocket);
contact.getConnectionConfiguration().setBoshService("wss://xmpp.example.com:5291");
contact.getConnectionConfiguration().setUserJID(user.getBareJid());
contact.getConnectionConfiguration().setUserPassword(password);
try {
contact.login(true);
if (contact.isConnected()) {
contact.disconnect();
}
} catch (Exception e) {
e.printStackTrace();
}
(免责声明:我来自 Tigase 团队,该团队创建了 JaXMPP 和 StorkIM)
【讨论】: