使用Chats传递消息

来回发送消息是即时通讯的核心。虽然个人消息可以以数据包形式进行发送和接收,通常更容易的方式是:把消息的字符串当做一个org.jivesoftware.smack.Chat 类进行处理。

聊天

聊天会在两个用户之间创建一个新线程的消息(使用线程ID)。下面的代码片段演示了如何创建一个新的和用户的聊天,然后发送给他们一个消息:

  1. // Assume we've created an XMPPConnection name "connection"._
  2. ChatManager chatmanager = connection.getChatManager();
  3. Chat newChat = chatmanager.createChat("jsmith@jivesoftware.com", new MessageListener() {
  4. public void processMessage(Chat chat, Message message) {
  5. System.out.println("Received message: " + message);
  6. }
  7. });
  8. try {
  9. newChat.sendMessage("Howdy!");
  10. }
  11. catch (XMPPException e) {
  12. System.out.println("Error Delivering block");
  13. }

Chat.sendMessage(String)方法是一种创建一个消息对象方便的方法,使用字符串参数作为主体内容,然后发送消息。如果你想在发送一条消息时设置额外的值,
使用 Chat.createMessage()Chat.sendMessage(消息) 方法,就像下面的代码片段:

  1. // Assume a MessageListener we've setup with a chat._
  2. public void processMessage(Chat chat, Message message) {
  3. // Send back the same text the other user sent us._
  4. chat.sendMessage(message.getBody());
  5. }

接收的聊天

当聊天是由另一个用户发起,设置略有不同,因为你是先接收到聊天信息,而不是显式地创建一个发送信息的聊天。当ChatManager创建它们时,你需要注册来处理新创建的实例。ChatManager已经找到一个匹配的聊天(通过线程id),如果不存在,那么它将创建一个匹配的新的聊天。这个新聊天,你必须注册通知什么时候发生。你可以注册一个消息监听器接收所有未来的消息作为这个处理程序的一部分。

  1. // Assume we've created an XMPPConnection name "connection"._
  2. ChatManager chatmanager = connection.getChatManager().addChatListener(
  3. new ChatManagerListener() {
  4. @Override
  5. public void chatCreated(Chat chat, boolean createdLocally)
  6. {
  7. if (!createdLocally)
  8. chat.addMessageListener(new MyNewMessageListener());;
  9. }
  10. });

除了基于线程的聊天信息,有些客户在聊天信息里不发送线程id。来处理这种情况,Smack将基于JID,尝试为传入消息匹配最适合的现有的聊天。它将尝试找到一个完全相同的JID聊天,如果做不到这一点,它将尝试JID基地。如果没有用户可以发现现有的聊天,然后创建一个新的。