使用 Smack 库在 XMPP 中发送消息不起作用
Sending message does not work in XMPP with Smack library
问题描述
我正在使用 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");
在这种情况下,我仍然可以收到传入消息,但是当我尝试使用 chat.send("message");
发送消息时,服务器没有收到任何消息,也没有调用 addOutgoingListener
回调。
知道为什么吗?
回答
深入挖掘我找到了答案,下面的代码将有助于发送消息
发送消息代码
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
和然后调用 chat.send(...)
您可以参考这段代码:
public void sendMessage(String to, Message newMessage) {
if(chatManager!=null) {
Chat newChat = chatManager.createChat(to);
try {
if (connection.isConnected() && connection.isAuthenticated()) {
newChat.sendMessage(newMessage);
}
} catch (SmackException.NotConnectedException e) {
e.printStackTrace();
}
}
else
{
Log.d(TAG,”chatmanager is null”);
}
}
而 link 是 https://ramzandroidarchive.wordpress.com/2016/03/13/send-messages-over-xmpp-using-smack-4-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();
}
}
问题描述
我正在使用 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");
在这种情况下,我仍然可以收到传入消息,但是当我尝试使用 chat.send("message");
发送消息时,服务器没有收到任何消息,也没有调用 addOutgoingListener
回调。
知道为什么吗?
回答
深入挖掘我找到了答案,下面的代码将有助于发送消息
发送消息代码
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
和然后调用 chat.send(...)
您可以参考这段代码:
public void sendMessage(String to, Message newMessage) {
if(chatManager!=null) {
Chat newChat = chatManager.createChat(to);
try {
if (connection.isConnected() && connection.isAuthenticated()) {
newChat.sendMessage(newMessage);
}
} catch (SmackException.NotConnectedException e) {
e.printStackTrace();
}
}
else
{
Log.d(TAG,”chatmanager is null”);
}
}
而 link 是 https://ramzandroidarchive.wordpress.com/2016/03/13/send-messages-over-xmpp-using-smack-4-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();
}
}