一、單人聊天
1)發送消息:
首先要獲取一個聊天窗口,getConnection()爲獲取連接connection的方法,調用getFriendChat()獲取
- 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字符串,以便更靈活的控制,發送消息完成~
- Chat chat = getFriendChat(friend,null);
- try {
- String msgjson = "{\"messageType\":\""+messageType+"\",\"chanId\":\""+chanId+"\",\"chanName\":\""+chanName+"\"}";
- chat.sendMessage(msgjson);
- } catch (XMPPException e) {
- e.printStackTrace();
- }
2)接受消息:
創建一個消息監聽器,單獨寫了一個類
- 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();
- }
- }
- }
- });
- }
- }
添加監聽,最好是放在登錄方法中,在關閉連接方法中,移除監聽,原因是爲了避免重複添加監聽,接受重複消息
退出程序應該關閉連接,移除監聽,該監聽可以接受所有好友的消息,很方便吧~
- TaxiChatManagerListener chatManagerListener = new TaxiChatManagerListener();
- getConnection().getChatManager().addChatListener(chatManagerListener);
- connection.getChatManager().removeChatListener(chatManagerListener);
1)、發送消息
首先要獲取會議室對象(MultiUserChat),有兩種方法獲取
兩個方法前面都有講到,這裏再回顧一下
1、創建會議室
- /**
- * 創建房間
- *
- * @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、加入會議室,
- /**
- * 加入會議室
- *
- * @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()方法即可,很容易吧~
- try {
- multiUserChat.sendMessage(message);
- } catch (XMPPException e) {
- e.printStackTrace();
- }
創建會議室消息監聽器,這裏我也單獨寫了一個類
- 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();
- }
- }
添加監聽器,每個會議室聊天對象都要添加一個消息監聽器,爲了避免重複監聽
應該把會議室聊天對象放在一個集合當中,需要用到的時候取出來用即可。
- multiUserChat.addMessageListener(new TaxiMultiListener());