XMPP客户端库Smack 4.0.6版开发之五

XMPP客户端库Smack 4.0.6版开发之五

作者:chszs,转载需注明。博客主页:

四、使用Chat消息通信

来回收发消息是即时通信的核心功能。尽管单条消息是以包的形式发送和接收的,通常还是把他视为聊天的消息字符串,使用org.jivesoftware.smack.Chat类。

1、Chat类

一个聊天Chat会在两个用户之间创建一个消息线程(通过线程ID)。下面的代码片段演示了怎样创建一个新聊天,然后向用户发送一条文本消息:

//假设已经创建了一个名为"connection"的XMPPConnection

ChatManagerchatmanager = connection.getChatManager();

ChatnewChat = chatmanager.createChat("jsmith@jivesoftware.com", newMessageListener(){

public void processMessage(Chat chat,Message message){

System.out.println(“Receivedmessage: “+ message);

}

});

try{

newChat.sendMessage(“Howdy!”);

}catch(XMPPExceptione){

System.out.println(“Error Deliveringblock”);

}

Chat.sendMessage(String)方法可以方便地创建一个消息Message对象,用字符串参数设置消息正文Body,然后发送消息。在某些情况下你可能希望在发送消息前设置额外的值,使用Chat.createMessage()方法和Chat.sendMessage(Message)方法,如下面的代码片段所示:

MessagenewMessage = new Message();

newMessage.setBody(“Howdy!”);

message.setProperty(“favoriteColor”,“red”);

newChat.sendMessage(newMessage);

前面的例子中,我们可以注意到,,在创建聊天Chat时指定了一个消息监听器MessageListener,在任意时刻,当来自其它用户的聊天消息到达后,消息监听器会得到通知。下面的代码片段使用了监听器做鹦鹉学舌,它会回显来自其他用户传递的消息。

//假设在聊天Chat中已经设置了消息监听器MessageListener

publicvoid processMessage(Chat chat, Message message){

// 把用户发送的消息内容发送给用户

chat.sendMessage(message.getBody());

}

2、来电聊天

当提示有另一个用户的聊天消息到了后,设置有轻微的不同,因为你是首次接收到聊天消息。取代明确地创建一个Chat来发送消息,当ChatManager创建了Chat实例后,你需要注册处理新创建的Chat实例。ChatManager会通过线程ID找到匹配的Chat,如果Chat不存在,那么它会创建一个新Chat对象来匹配。要得到这个新Chat,你必须注册来得到通知。可以注册一个消息监听器来接收所有要到来的消息。

//假定已经创建了名为”connection”的XMPPConnection

ChatManagercm = connection.getChatManager().addChatListener(new ChatManagerListener(){

@Override

public void chatCreated(Chat chat, BooleancreatedLocally){

if(!createdLocally)

chat.addMessageListener(newMyNewMessageListener());

}

});

除了基于线程的Chat消息,也有一些客户端不发送线程ID作为Chat的一部分。要处理这种情况,Smack会基于JID尝试匹配接收的消息到最匹配现有的Chat。它会尝试用完整的JID来查找Chat,如果搜不到,再尝试用基本的JID来查找Chat。如果找不到现有的Chat来匹配,那么会创建一个新Chat。

只有经历过地狱般的折磨,才有征服天堂的力量。

XMPP客户端库Smack 4.0.6版开发之五

相关文章:

你感兴趣的文章:

标签云: