
Smack3.4.1文档翻译:通过聊天来传送消息,Messaging using Chats
用户之间互相 发送消息,这是实时消息系统 的核心功能。尽管 可以将单独的消息作为数据包来 发送及接收,但是,通常情况 下,使用 org.jivesoftware.smack.Chat 类来将消息 中的字符串作为聊天对象来使用的话,更容易。
聊天对象(Chat)
一个聊天对象,会在两个用户之间创建一个新的消息序列(thread)(使用序列编号来标识)。以下代码片段,演示了,如何创建一个针对某个用户的新的Chat对象,然后向他/她/它发送一条文字消息:
// 假设我们已经创建了一个叫做"connection"的Connection 实例。
ChatManager chatmanager = connection.getChatManager();
Chat newChat = chatmanager.createChat("jsmith@jivesoftware.com", new MessageListener() {
public void processMessage(Chat chat, Message message) {
System.out.println( "Received message: " + message);
}
});
try {
newChat.sendMessage( "Howdy!" );
}
catch (XMPPException e) {
System.out.println( "Error Delivering block" );
}
Chat.sendMessage(String) 方法 是一个便利方法,用于创建一个Message 对象,使用给定的String 参数来设置消息的主体内容,然后发 出 该消息。如果 妳想要在发出一条消息之前设置一些额外的值的 话 , 可使用 Chat.createMessage() 和 Chat.sendMessage(Message) 方法 ,如以下代码片段所示:
Message newMessage = new Message();
newMessage.setBody("Howdy!");
message.setProperty("favoriteColor", "red");
newChat.sendMessage(newMessage);
妳应当也注意到了,在上面的那个示例中,我们在创建聊天对象时,给它设置了一个MessageListener。每当此聊天对象中对端的用户发来一条新消息时,就会通知该监听器。以下代码片段会将该监听器作为一个应声虫(parrot-bot)来使用 -- 它会将对方用户发来的任何消息原样发送回去。
// 假设 这是我们已经针对某个聊天对象设置 好的 一个 MessageListener 。
public void processMessage(Chat chat, Message message) {
// 将对方用户发送过来的内容原样发送回去。
chat.sendMessage(message.getBody());
}
对方 发起的聊天
如果聊天是由别的用户发起的,那么,建议过程稍微有点不同,因为妳首先会收到一条聊天消息。在这种情况下,妳不再显式地创建一个聊天对象以用来发送消息,而应当注册一个处理器,当ChatManager 创建了新的Chat 实例时便处理它们。
ChatManager会先尝试(依据聊天序列编号)找到一个匹配的聊天对象,如果找不到的话,则会创建一个相匹配的新的聊天对象。要获取到这个新的聊天对象的话,妳需要注册到相应的事件,以便在它发生时通知妳。妳可以在这个处理器中同时注册一个消息监听器,以便处理日后所有的消息。
// 假设我们已经创建了一个叫做"connection"的Connection。
ChatManager chatmanager = connection.getChatManager().addChatListener(
new ChatManagerListener() {
@Override
public void chatCreated(Chat chat, boolean createdLocally)
{
if (!createdLocally)
chat.addMessageListener(new MyNewMessageListener());;
}
});
除了以聊天序列为依据的聊天消息之外,某些客户端不会在聊天事件中发送序列编号。针对这种情况,Smack会以 JID 为依据来尽可能准确地将对方发来的聊天消息匹配到当前已有的聊天对象中。它会尝试着找到一个拥有相同的完整JID 的聊天对象,如果未找到的话,会尝试找到与基本JID 相匹配的聊天对象。如果找不到针对该用户的已有聊天对象,则会创建一个新的。
未知美人
HxLauncher: Launch Android applications by voice commands