Android 基于XMPP Smack Openfire 单人聊天和多人聊天(发送消息、接收消息)
一、单人聊天
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)接受消息:
创建一个消息监听器,这里我单独写了一个类
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 {// 创建一个MultiUserChatmuc = 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());// 用户JIDsubmitForm.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)接受消息
    创建会议室消息监听器,这里我也单独写了一个类
import org.jivesoftware.smack.PacketListener;import org.jivesoftware.smack.packet.Message;import org.jivesoftware.smack.packet.Packet;/** * 会议室消息监听类 *  * @author Administrator *  */public class TaxiMultiListener implements PacketListener {@Overridepublic void processPacket(Packet packet) {Message message = (Message) packet;String body = message.getBody();}}

添加监听器,每个会议室聊天对象都要添加一个消息监听器,为了避免重复监听
应该把会议室聊天对象放在一个集合当中,需要用到的时候取出来用即可。
multiUserChat.addMessageListener(new TaxiMultiListener());

更多相关文章

  1. Android -- 消息处理机制源码分析(Looper,Handler,Message)
  2. Android:Umeng(友盟)消息推送(二)
  3. Android输入法框架中按键消息的处理流程
  4. Android Widget--窗口小部件详解
  5. mqtt向android推送消息(一)——发送端使用.net

随机推荐

  1. Android+JNI调用–文件操作
  2. android的生命周期
  3. Android中使用httpclient等小结
  4. 轮播图的暂停与播放
  5. PHP使用流包装器实现WebShell的方法
  6. 如何避免PHP实例代码中的一些坏代码
  7. 基于Laravel Auth自定义接口API用户认证
  8. PHP实现用户异地登录提醒功能的方法【基
  9. Laravel认证原理以及完全自定义认证详解
  10. 基于php解决json_encode中文UNICODE转码