如何编写简单的smack 4.2.3应用程序连接到服务器并回答用户

时间:2018-04-05 07:52:38

标签: java xmpp smack

我有简单的smack 3.2.1应用程序。它连接到xmpp服务器 并等待另一个用户对话启动。当用户提问时 通过聊天,应用程序发送响应(回答)。它工作正常。这是代码:

JabberApplication.java:

package jabberapplication;

import org.jivesoftware.smack.XMPPException;

public class JabberApplication {

public static void main(String[] args) throws XMPPException,    InterruptedException {

    String username = "USERNAME";
    String password = "PASSWORD";
    String server = "SERVER";
    int port=5222;

    XmppManager xmppManager = new XmppManager(server, port);
    xmppManager.init();
    xmppManager.performLogin(username, password);
    xmppManager.setStatus(true, "Hello everyone");

    boolean isRunning = true;
    while (isRunning) {
        Thread.sleep(50);
    }
    xmppManager.destroy();
    }
}

XmppManager.java:

package jabberapplication;

import org.jivesoftware.smack.Chat;
import org.jivesoftware.smack.ChatManager;
import org.jivesoftware.smack.ChatManagerListener;
import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.MessageListener;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.packet.Presence;
import org.jivesoftware.smack.packet.Presence.Type;

public class XmppManager {

private final String server;
private final int port;

private XMPPConnection connection;

private ChatManager chatManager;
private MessageListener messageListener;

private ConversationController conversationController;

public XmppManager(String server, int port) {
    this.server = server;
    this.port = port;
}

public void init() throws XMPPException {

    System.out.println(String.format("Initializing connection to server %1$s port %2$d", server, port));


    ConnectionConfiguration connectionConfiguration = new ConnectionConfiguration(server, port);
    connection = new XMPPConnection(connectionConfiguration);

    connection.connect();
    System.out.println("Connected: " + connection.isConnected());

    chatManager = connection.getChatManager();
    chatManager.addChatListener(new MyChatManagerListener());
    messageListener = new MyMessageListener();

    conversationController = new ConversationController();
}

public void performLogin(String username, String password) throws XMPPException {
    if (connection != null && connection.isConnected()) {
        connection.login(username, password);
    }
}

public void setStatus(boolean available, String status) {
    Presence.Type type = available ? Type.available : Type.unavailable;
    Presence presence = new Presence(type);
    presence.setStatus(status);
    connection.sendPacket(presence);
}

public void destroy() {
    if (connection != null && connection.isConnected()) {
        connection.disconnect();
    }
}

public void sendMessage(String message, String buddyJID) throws XMPPException {
    System.out.println(String.format("Sending mesage '%1$s' to user %2$s", message, buddyJID));
    Chat chat = chatManager.createChat(buddyJID, messageListener);
    chat.sendMessage(message);
}

class MyMessageListener implements MessageListener {
    @Override
    public void processMessage(Chat chat, Message message) {
        String from = message.getFrom();
        String body = message.getBody();
        if (!body.equals("null")) {
            System.out.println(String.format("Received message '%1$s' from %2$s", body, from));
            try {
                chat.sendMessage(conversationController.getAnswer(body));
            } catch (XMPPException ex) {
                 System.out.println(ex.getMessage());
            }
        }
    }
}

class MyChatManagerListener implements ChatManagerListener {
    @Override
    public void chatCreated(Chat chat, boolean bln) {
        int indexAt = chat.getParticipant().indexOf("@");
        String username = chat.getParticipant().substring(0, indexAt);
        chat.addMessageListener(messageListener);
        try {
            chat.sendMessage("Hello " + username + " !");
        } catch (XMPPException ex) {
            System.out.println(ex.getMessage());
        }
    }
}
}

嗯,问题是:如何使用smack库版本4.2.3编写类似的应用程序。看起来在4.2.3中没有MessageListener和ChatManagerListener类。有什么建议吗?

最诚挚的问候。

1 个答案:

答案 0 :(得分:0)

对于Smack 4.2.3,ChatManagerListener接口位于org.jivesoftware.smack.chat类下(注意:聊天不是聊天)。 因此,您需要将导入更改为org.jivesoftware.smack.chat.ChatManagerListener。 此外,MessageListener现在也在org.jivesoftware.smack.chat类下更改为ChatMessageListener。 因此,您需要将导入更改为org.jivesoftware.smack.chat.ChatMessageListener。 并将工具重命名为如下: class MyMessageListener实现ChatMessageListener