如何编写Smack 4.2.3简单应用:连接服务器并回复用户
适配Smack 4.2.3的XMPP消息回复应用实现
刚好之前帮朋友把Smack从3.x升级到4.2.x,给你整理了一个完整的适配4.2.3版本的示例,直接就能实现连接服务器、监听对话并自动回复的功能,顺便讲讲和旧版本的核心差异,方便你迁移:
第一步:添加依赖(Maven)
Smack 4.x把功能拆分成了多个模块,需要引入核心、TCP连接、即时消息这几个基础模块,如果需要SSL支持还要加Java7适配模块:
<dependencies> <dependency> <groupId>org.igniterealtime.smack</groupId> <artifactId>smack-core</artifactId> <version>4.2.3</version> </dependency> <dependency> <groupId>org.igniterealtime.smack</groupId> <artifactId>smack-tcp</artifactId> <version>4.2.3</version> </dependency> <dependency> <groupId>org.igniterealtime.smack</groupId> <artifactId>smack-im</artifactId> <version>4.2.3</version> </dependency> <dependency> <groupId>org.igniterealtime.smack</groupId> <artifactId>smack-java7</artifactId> <version>4.2.3</version> </dependency> </dependencies>
第二步:完整代码实现
package jabberapplication; import org.jivesoftware.smack.AbstractXMPPConnection; import org.jivesoftware.smack.Chat; import org.jivesoftware.smack.ChatManager; import org.jivesoftware.smack.ChatManagerListener; import org.jivesoftware.smack.MessageListener; import org.jivesoftware.smack.SmackException; import org.jivesoftware.smack.XMPPException; import org.jivesoftware.smack.tcp.XMPPTCPConnection; import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration; import org.jxmpp.stringprep.XmppStringprepException; public class JabberApplication { public static void main(String[] args) throws XMPPException, SmackException, InterruptedException, XmppStringprepException { // 替换成你的实际配置 String username = "USERNAME"; String password = "PASSWORD"; String xmppServer = "your-xmpp-server.com"; int port = 5222; // 默认XMPP端口,部分服务器可能用5223(SSL) // 构建连接配置 XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder() .setXmppDomain(xmppServer) .setHost(xmppServer) .setPort(port) .setUsernameAndPassword(username, password) .setSecurityMode(XMPPTCPConnectionConfiguration.SecurityMode.required) // 根据服务器调整,不需要SSL就改成disabled .setDebuggerEnabled(true) // 开启调试,生产环境建议关闭 .build(); // 创建连接实例 AbstractXMPPConnection connection = new XMPPTCPConnection(config); try { // 连接并登录 connection.connect(); System.out.println("✅ 成功连接到XMPP服务器"); connection.login(); System.out.println("✅ 用户 " + username + " 登录成功"); // 获取聊天管理器,监听新对话 ChatManager chatManager = ChatManager.getInstanceFor(connection); chatManager.addChatListener(new ChatManagerListener() { @Override public void chatCreated(Chat chat, boolean createdLocally) { // 只处理对方发起的对话(排除本地主动创建的会话) if (!createdLocally) { chat.addMessageListener(new MessageListener() { @Override public void processMessage(Chat chat, org.jivesoftware.smack.packet.Message message) { // 过滤空消息和自己发的消息 if (message.getBody() == null || message.getFrom().equals(connection.getUser())) { return; } System.out.println("📩 收到来自 " + message.getFrom() + " 的消息: " + message.getBody()); // 构造回复内容 String reply = "我收到你的消息啦:" + message.getBody(); try { chat.sendMessage(reply); System.out.println("💬 已回复消息: " + reply); } catch (SmackException.NotConnectedException | InterruptedException e) { System.err.println("❌ 发送回复失败: " + e.getMessage()); } } }); } } }); // 保持程序运行,等待消息 System.out.println("⌛ 等待用户发起对话..."); Thread.sleep(Long.MAX_VALUE); } finally { // 确保连接关闭 if (connection.isConnected()) { connection.disconnect(); System.out.println("🔌 已断开服务器连接"); } } } }
和Smack 3.2.1的核心差异说明
- 连接配置重构:用
XMPPTCPConnectionConfiguration.builder()链式配置替代了旧版的ConnectionConfiguration,配置项更清晰,类型更安全。 - 连接实例分层:用
AbstractXMPPConnection作为父类,XMPPTCPConnection专门处理TCP连接,替代了旧版单一的XMPPConnection。 - 聊天监听逻辑优化:通过
ChatManagerListener监听新会话,再给每个会话添加MessageListener,比旧版的监听方式更模块化。 - 异常细分:拆分了
SmackException为多个子异常(比如NotConnectedException),需要更细致的捕获处理。
注意事项
- 替换代码中的
USERNAME、PASSWORD、your-xmpp-server.com为你的实际服务器信息。 - 如果服务器不要求SSL/TLS,把
SecurityMode改成SecurityMode.disabled或SecurityMode.ifpossible。 - 调试模式
setDebuggerEnabled(true)可以在控制台看到XMPP原始报文,方便排查问题,生产环境建议关闭。 - 示例中用
Thread.sleep(Long.MAX_VALUE)保持程序运行,实际生产环境可以用更优雅的方式(比如阻塞队列、信号量)。
内容的提问来源于stack exchange,提问作者piotrassss
相关产品推荐
相关产品推荐

