使用Smack库在XMPP中发送消息不起作用

时间:2017-09-28 20:42:21

标签: java android xmpp chat smack

问题描述

我正在使用XMPP和Smack Android库编写聊天应用程序。我使用下面的代码发送消息,一切正常。

final ChatManager chatManager = ChatManager.getInstanceFor(connection);
chatManager.addChatListener(this); 
....

@Override
public void chatCreated(Chat chat, boolean createdLocally) {
    chat.addMessageListener(this);
}

@Override
public void processMessage(Chat chat, Message message) {
    // Do something here.
}

Chat chat = ChatManager.getInstanceFor(connection).createChat(jid);
chat.sendMessage("message");

问题

不幸的是,上面的API已被弃用org.jivesoftware.smack.chat.Chat,而我应该使用org.jivesoftware.smack.chat2.Chat,因此我正在更改实施,如下所示

final ChatManager chatManager = ChatManager.getInstanceFor(connection);
chatManager.addOutgoingListener(this);
chatManager.addIncomingListener(this);
....
Chat chat = ChatManager.getInstanceFor(connection).chatWith(jid);
chat.send("message");

在这种情况下,我仍然可以收到Incoming消息,但是当我尝试使用chat.send("message");服务器发送消息时,没有得到任何内容,并且未调用addOutgoingListener回调。

任何想法为什么?

3 个答案:

答案 0 :(得分:1)

有一个使用旧版smack的示例:

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;

public class Test {
    public static void main(String args[]) throws XMPPException {
        ConnectionConfiguration config = new ConnectionConfiguration("127.0.0.1", 5222);    
        XMPPConnection connection = new XMPPConnection(config); 
        connection.connect();   
        connection.login("userx", "123456");
        ChatManager cm = connection.getChatManager(); 
        Chat chat = cm.createChat("tongqian@tsw-PC", null);
        /*
         * add listener
         */
        cm.addChatListener(new ChatManagerListener() {
            @Override
            public void chatCreated(Chat chat, boolean create) {
                chat.addMessageListener(new MessageListener() {
                    @Override
                    public void processMessage(Chat chat, Message msg) {
                        System.out.println(chat.getParticipant() + ":" + msg.getBody());
                    }
                });
            }
        });
        chat.sendMessage("hello");  
        while(true);        
        //connection.disconnect();  
    }
}

答案 1 :(得分:0)

答案

挖掘更多的北斗星我找到了答案,所以下面的代码将有助于发送消息

发送消息代码

final Chat chat = ChatManager.getInstanceFor(connection).chatWith(jid);

Message newMessage = new Message(jid, Message.Type.chat);
newMessage.setBody(message);

chat.send(newMessage);

结论

因此,您需要创建Message对象,而不是发送字符串消息,我认为更重要的是在构造函数中指定Message.Type.chat,并jid然后调用{{ 1}}

答案 2 :(得分:0)

相关问题