很久沒有寫博客了,回顧了一下原先學習的,接著沒有寫完的繼續寫咯。(ps:告訴大家一個秘密,其實寫寫博客對自己的幫助是非常大的哦~)
好了廢話不多說,進入主題吧。
一、單人聊天
1)發送消息:
首先要獲取一個聊天窗口,getConnection()為獲取連接connection的方法,調用getFriendChat()獲取
[java]
private Map<String, Chat> chatManage = new HashMap<String, Chat>();// 聊天窗口管理map集合
/**
* 獲取或創建聊天窗口
* @param friend 好友名
* @param listenter 聊天監聽器
* @return
*/
public Chat getFriendChat(String friend, MessageListener listenter) {
if(getConnection()==null)
return null;
/** 判斷是否創建聊天窗口 */
for (String fristr : chatManage.keySet()) {
if (fristr.equals(friend)) {
// 存在聊天窗口,則返回對應聊天窗口
return chatManage.get(fristr);
}
}
/** 創建聊天窗口 */
Chat chat = getConnection().getChatManager().createChat(friend + "@"+
getConnection().getServiceName(), listenter);
/** 添加聊天窗口到chatManage */
chatManage.put(friend, chat);
return chat;
}
friend為好友名,不是JID;listener 監聽器可以傳null,利用聊天窗口對象調用sendMessage發送消息
這裡sendMessage我傳的是一個JSON字符串,以便更靈活的控制,發送消息完成,很簡單吧~
[java]
Chat chat = getFriendChat(friend,null);
try {
String msgjson = "{\"messageType\":\""+messageType+"\",\"chanId\":\""+chanId+"\",\"chanName\":\""+chanName+"\"}";
chat.sendMessage(msgjson);
} catch (XMPPException e) {
e.printStackTrace();
}
2)接受消息:
創建一個消息監聽器,這裡我單獨寫了一個類
[java]
package com.techrare.listener;
import org.jivesoftware.smack.Chat;
import org.jivesoftware.smack.ChatManagerListener;
import org.jivesoftware.smack.MessageListener;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.util.StringUtils;
import org.json.JSONException;
import org.json.JSONObject;
import com.techrare.utils.XmppConnection;
/**
* 單人聊天信息監聽類
*
* @author Administrator
*
*/
public class TaxiChatManagerListener implements ChatManagerListener {
public void chatCreated(Chat chat, boolean arg1) {
chat.addMessageListener(new MessageListener() {
public void processMessage(Chat arg0, Message msg) {
//登錄用戶
StringUtils.parseName(XmppConnection.getInstance().getConnection().getUser());
//發送消息用戶
msg.getFrom();
//消息內容
String body = msg.getBody();
boolean left = body.substring(0, 1).equals("{");
boolean right = body.substring(body.length()-1, body.length()).equals("}");
if(left&&right){
try {
JSONObject obj = new JSONObject(body);
String type = obj.getString("messageType");
String chanId = obj.getString("chanId");
String chanName = obj.getString("chanName");
} catch (JSONException e) {
e.printStackTrace();
}
}
}
});
}
}
添加監聽,最好是放在登錄方法中,在關閉連接方法中,移除監聽,原因是為了避免重復添加監聽,接受重復消息
退出程序應該關閉連接,移除監聽,該監聽可以接受所有好友的消息,很方便吧~
[java]
TaxiChatManagerListener chatManagerListener = new TaxiChatManagerListener();
getConnection().getChatManager().addChatListener(chatManagerListener);
[java]
connection.getChatManager().removeChatListener(chatManagerListener);
二、多人聊天(會議室)
1)、發送消息
首先要獲取會議室對象(MultiUserChat),有兩種方法獲取
兩個方法前面都有講到,這裡再回顧一下
1、創建會議室
[java]
/**
* 創建房間
*
* @param roomName 房間名稱
*/
public MultiUserChat createRoom(String user, String roomName,String password) {
if (getConnection() == null)
return null;
MultiUserChat muc = null;
try {
// 創建一個MultiUserChat
muc = new MultiUserChat(getConnection(), roomName + "@conference."
+ getConnection().getServiceName());
// 創建聊天室
muc.create(roomName);
// 獲得聊天室的配置表單
Form form = muc.getConfigurationForm();
// 根據原始表單創建一個要提交的新表單。
Form submitForm = form.createAnswerForm();
// 向要提交的表單添加默認答復
for (Iterator<FormField> fields = form.getFields(); fields
.hasNext();) {
FormField field = (FormField) fields.next();
if (!FormField.TYPE_HIDDEN.equals(field.getType())
&& field.getVariable() != null) {
// 設置默認值作為答復
submitForm.setDefaultAnswer(field.getVariable());
}
}
// 設置聊天室的新擁有者
List<String> owners = new ArrayList<String>();
owners.add(getConnection().getUser());// 用戶JID
submitForm.setAnswer("muc#roomconfig_roomowners", owners);
// 設置聊天室是持久聊天室,即將要被保存下來
submitForm.setAnswer("muc#roomconfig_persistentroom", true);
// 房間僅對成員開放
submitForm.setAnswer("muc#roomconfig_membersonly", false);
// 允許占有者邀請其他人
submitForm.setAnswer("muc#roomconfig_allowinvites", true);
if (!password.equals("")) {
// 進入是否需要密碼
submitForm.setAnswer("muc#roomconfig_passwordprotectedroom",
true);
// 設置進入密碼
submitForm.setAnswer("muc#roomconfig_roomsecret", password);
}
// 能夠發現占有者真實 JID 的角色
// submitForm.setAnswer("muc#roomconfig_whois", "anyone");
// 登錄房間對話
submitForm.setAnswer("muc#roomconfig_enablelogging", true);
// 僅允許注冊的昵稱登錄
submitForm.setAnswer("x-muc#roomconfig_reservednick", true);
// 允許使用者修改昵稱
submitForm.setAnswer("x-muc#roomconfig_canchangenick", false);
// 允許用戶注冊房間
submitForm.setAnswer("x-muc#roomconfig_registration", false);
// 發送已完成的表單(有默認值)到服務器來配置聊天室
muc.sendConfigurationForm(submitForm);
} catch (XMPPException e) {
e.printStackTrace();
return null;
}
return muc;
}
2、加入會議室,
[java]
/**
* 加入會議室
*
* @param user
* 昵稱
* @param password
* 會議室密碼
* @param roomsName
* 會議室名
*/
public MultiUserChat joinMultiUserChat(String user, String roomsName,
String password) {
if (getConnection() == null)
return null;
try {
// 使用XMPPConnection創建一個MultiUserChat窗口
MultiUserChat muc = new MultiUserChat(getConnection(), roomsName
+ "@conference." + getConnection().getServiceName());
// 聊天室服務將會決定要接受的歷史記錄數量
DiscussionHistory history = new DiscussionHistory();
history.setMaxChars(0);
// history.setSince(new Date());
// 用戶加入聊天室
muc.join(user, password, history,
SmackConfiguration.getPacketReplyTimeout());
Log.i("MultiUserChat", "會議室【"+roomsName+"】加入成功........");
return muc;
} catch (XMPPException e) {
e.printStackTrace();
Log.i("MultiUserChat", "會議室【"+roomsName+"】加入失敗........");
return null;
}
}
調用這個兩個方法都可以獲取到MultiUserChat,根據需求選擇一個就可以。
利用MultiUserChat對象調用sendMessage()方法即可,很容易吧~
[java]
try {
multiUserChat.sendMessage(message);
} catch (XMPPException e) {
e.printStackTrace();
}
2)接受消息
創建會議室消息監聽器,這裡我也單獨寫了一個類
[java]
package com.techrare.listener;
import org.jivesoftware.smack.PacketListener;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.packet.Packet;
/**
* 會議室消息監聽類
*
* @author Administrator
*
*/
public class TaxiMultiListener implements PacketListener {
@Override
public void processPacket(Packet packet) {
Message message = (Message) packet;
String body = message.getBody();
}
}
添加監聽器,每個會議室聊天對象都要添加一個消息監聽器,為了避免重復監聽
應該把會議室聊天對象放在一個集合當中,需要用到的時候取出來用即可。
[java]
multiUserChat.addMessageListener(new TaxiMultiListen