openfire Android 学习(四)----单人聊天和多人聊天(发送消息、接收消息)
一、单人聊天
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();
- }
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());
openfire Android 学习(四)----单人聊天和多人聊天(发送消息、接收消息)的更多相关文章
- Openfire 单人聊天和多人聊天(发送消息、接收消息)
Openfire 单人聊天和多人聊天(发送消息.接收消息) 一.单人聊天 1)发送消息: 首先要获取一个聊天窗口,getConnection()为获取连接connection的方法,调用getFrie ...
- openfire Android学习(三)----会议室创建、加入以及查询会议室中所有成员等
openfire 中的会议室不像QQ群一样,不能保存那些离线用户,加入会议室后,一旦断开连接,就会离开会议室. 虽然如此,但如果要实现也不是不可能,我们可以自己做后台来保存,有兴趣的可以去试着实现一下 ...
- openfire Android学习(六)----总结
Xmpp的一些方法整理到一个工具类中了 XmppConnection.java [java] view plaincopy [java] view plaincopy import java.io.B ...
- Android学习小Demo(19)利用Loader来实时接收短信
之前写过一篇文章<Android学习小Demo(13)Android中关于ContentObserver的使用>,在里面利用ContentOberver去监測短信URI内容的变化.我们先来 ...
- Android Wear开发 - 数据通讯 - 第二节 : 数据的发送与接收
本节由介绍3种数据的发送接收:1.Data Items : 比特类型数据,限制100KB以内2.Assets : 资源类型数据,大小无上限3.Message : 发送消息,触发指令 http://de ...
- openfire Android学习---android客户端聊天开发之登录 和 注销登录
一切就绪,新建一个android测试工程: 上网权限配置,界面绘制啥的,这里就不说了. 首先 导入一个smark包.这个是用来维护长连接的,也可以是asmark.我用的是asmark 先普及一些基本知 ...
- openfire Android学习(一)----实现用户注册、登录、修改密码和注销等
以前学习过用Scoket 建立聊天,简单的建立聊天是没问题的,但如果要实现多人复杂的聊天,后台服务器代码就比较复杂,对于我这新手来讲就比较难了.后来在网上看到用openfire做服务器,利用强大的Sm ...
- android学习四(Activity的生命周期)
要学好活动(Activity).就必需要了解android中Activity的声明周期.灵活的使用生命周期.能够开发出更好的程序,在android中是使用任务来管理活动的,一个任务就是一组存放在栈里的 ...
- android学习四---Activity和Intent
1.android项目资源深入了解 在深入学习android之前,先好好玩玩手机上的应用,大部分程序都有一个图标,点开图标,程序启动,一定时间后,程序会跳转到第一个界面,比如手机QQ,点开图标,会跳出 ...
随机推荐
- redis--py操作redis【转】
Python操作redis 请给作者点赞--> 原文链接 python连接方式:点击 下面介绍详细使用 1.String 操作 redis中的String在在内存中按照一个name对应一个val ...
- try_except__异常处理
try...except.raise 一.try...except 有时候我们写程序的时候,会出现一些错误或异常,导致程序终止.例如,做除法时,除数为0,会引起一个ZeroDivisionError ...
- re--参考手册
表达式全集 字符 描述 \ 将下一个字符标记为一个特殊字符.或一个原义字符.或一个向后引用.或一个八进制转义符.例如,“n”匹配字符“n”.“\n”匹配一个换行符.串行“\\”匹配“\”而“\(”则匹 ...
- mac 命令行下连接到MySQL mysql: command not found
mac下刚刚安装完MySQL后使用命令连接到MySQL mysql -uroot -p 提示: -bash: mysql: command not found使用 /usr/local/mysql ...
- Android中如何截取字符串中某个字符之前或之后的字符串
代码改变世界 Android中如何截取字符串中某个字符之前或之后的字符串 //截取#之前的字符串 String str = "sdfs#d"; str.substring(0, s ...
- 【bzoj2134】单选错位 期望
题目描述 输入 n很大,为了避免读入耗时太多,输入文件只有5个整数参数n, A, B, C, a1,由上交的程序产生数列a.下面给出pascal/C/C++的读入语句和产生序列的语句(默认从标准输入读 ...
- 【bzoj4785】[Zjoi2017]树状数组 线段树套线段树
题目描述 漆黑的晚上,九条可怜躺在床上辗转反侧.难以入眠的她想起了若干年前她的一次悲惨的OI 比赛经历.那是一道基础的树状数组题.给出一个长度为 n 的数组 A,初始值都为 0,接下来进行 m 次操作 ...
- kb-07线段树--10--dfs序建树
/* hdu3974 dfs序建树,然后区间修改查询: */ #include<iostream> #include<cstdio> #include<cstring&g ...
- HDU——2602Bone Collector(01背包)
Bone Collector Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- vue2.0 mintUI 学习备忘
一 技术栈:vuecli+vuejs2+mintUI+axios vuecli :脚手架工具 vuejs:前端框架 mintUI:基于vuejs移动端UI axios:vuejs ajax数据交互 ...
