You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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的核心差异说明

  1. 连接配置重构:用XMPPTCPConnectionConfiguration.builder()链式配置替代了旧版的ConnectionConfiguration,配置项更清晰,类型更安全。
  2. 连接实例分层:用AbstractXMPPConnection作为父类,XMPPTCPConnection专门处理TCP连接,替代了旧版单一的XMPPConnection。
  3. 聊天监听逻辑优化:通过ChatManagerListener监听新会话,再给每个会话添加MessageListener,比旧版的监听方式更模块化。
  4. 异常细分:拆分了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:05:00