一、单人聊天
1)发送消息:
首先要获取一个聊天窗口,getConnection()为获取连接connection的方法,调用getFriendChat()获取
[java] view plain copy 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] view plain copy Chat chat = getFriendChat(friend,null); try { String msgjson = "{\"messageType\":\""+messageType+"\",\"chanId\":\""+chanId+"\",\"chanName\":\""+chanName+"\"}"; chat.sendMessage(msgjson); } catch (XMPPException e) { e.printStackTrace(); } 2)接受消息:
创建一个消息监听器,单独写了一个类
[java] view plain copy 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] view plain copy TaxiChatManagerListener chatManagerListener = new TaxiChatManagerListener(); getConnection().getChatManager().addChatListener(chatManagerListener); [java] view plain copy connection.getChatManager().removeChatListener(chatManagerListener); 二、多人聊天(会议室)
1)、发送消息
首先要获取会议室对象(MultiUserChat),有两种方法获取
两个方法前面都有讲到,这里再回顾一下
1、创建会议室
[java] view plain copy /** * 创建房间 * * @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] view plain copy /** * 加入会议室 * * @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] view plain copy try { multiUserChat.sendMessage(message); } catch (XMPPException e) { e.printStackTrace(); }
2)接受消息
创建会议室消息监听器,这里我也单独写了一个类
[java] view plain copy 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] view plain copy multiUserChat.addMessageListener(new TaxiMultiListener());
转载于:https://www.cnblogs.com/jasonkent27/p/4098438.html
相关资源:各显卡算力对照表!