Android基于XMPP Smack Openfire下学习开发IM(四)单人聊天和多人聊天(发送消息、接收消息)

很久没有写博客了,回顾了一下原先学习的,接着没有写完的继续写咯。(ps:告诉大家一个秘密,其实写写博客对自己的帮助是非常大的哦~)

好了废话不多说,进入主题吧。


一、单人聊天

1)发送消息:

首先要获取一个聊天窗口,getConnection()为获取连接connection的方法,调用getFriendChat()获取

	private Map chatManage = new HashMap();// 聊天窗口管理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 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 owners = new ArrayList();
			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();
}


2)接受消息

    创建会议室消息监听器,这里我也单独写了一个类

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());


希望能够給正在学习的同学们一点点帮助!


你可能感兴趣的:(Android,学习)