一、单人聊天

1)发送消息:

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

[java] view
plain
copy

  1. private Map<String, Chat> chatManage = new HashMap<String, Chat>();// 聊天窗口管理map集合
  2. /**
  3. * 获取或创建聊天窗口
  4. * @param friend 好友名
  5. * @param listenter 聊天監聽器
  6. * @return
  7. */
  8. public Chat getFriendChat(String friend, MessageListener listenter) {
  9. if(getConnection()==null)
  10. return null;
  11. /** 判断是否创建聊天窗口 */
  12. for (String fristr : chatManage.keySet()) {
  13. if (fristr.equals(friend)) {
  14. // 存在聊天窗口,则返回对应聊天窗口
  15. return chatManage.get(fristr);
  16. }
  17. }
  18. /** 创建聊天窗口 */
  19. Chat chat = getConnection().getChatManager().createChat(friend + "@"+
  20. getConnection().getServiceName(), listenter);
  21. /** 添加聊天窗口到chatManage */
  22. chatManage.put(friend, chat);
  23. return chat;
  24. }

friend为好友名,不是JID;listener 监听器可以传null,利用聊天窗口对象调用sendMessage发送消息

这里sendMessage我传的是一个JSON字符串,以便更灵活的控制,发送消息完成~

[java] view
plain
copy

  1. Chat chat = getFriendChat(friend,null);
  2. try {
  3. String msgjson = "{\"messageType\":\""+messageType+"\",\"chanId\":\""+chanId+"\",\"chanName\":\""+chanName+"\"}";
  4. chat.sendMessage(msgjson);
  5. } catch (XMPPException e) {
  6. e.printStackTrace();
  7. }

2)接受消息:

创建一个消息监听器,单独写了一个类

[java] view
plain
copy

  1. package com.techrare.listener;
  2. import org.jivesoftware.smack.Chat;
  3. import org.jivesoftware.smack.ChatManagerListener;
  4. import org.jivesoftware.smack.MessageListener;
  5. import org.jivesoftware.smack.packet.Message;
  6. import org.jivesoftware.smack.util.StringUtils;
  7. import org.json.JSONException;
  8. import org.json.JSONObject;
  9. import com.techrare.utils.XmppConnection;
  10. /**
  11. * 单人聊天信息监听类
  12. *
  13. * @author Administrator
  14. *
  15. */
  16. public class TaxiChatManagerListener implements ChatManagerListener {
  17. public void chatCreated(Chat chat, boolean arg1) {
  18. chat.addMessageListener(new MessageListener() {
  19. public void processMessage(Chat arg0, Message msg) {
  20. //登录用户
  21. StringUtils.parseName(XmppConnection.getInstance().getConnection().getUser());
  22. //发送消息用户
  23. msg.getFrom();
  24. //消息内容
  25. String body = msg.getBody();
  26. boolean left = body.substring(0, 1).equals("{");
  27. boolean right = body.substring(body.length()-1, body.length()).equals("}");
  28. if(left&&right){
  29. try {
  30. JSONObject obj = new JSONObject(body);
  31. String type = obj.getString("messageType");
  32. String chanId = obj.getString("chanId");
  33. String chanName = obj.getString("chanName");
  34. } catch (JSONException e) {
  35. e.printStackTrace();
  36. }
  37. }
  38. }
  39. });
  40. }
  41. }

添加监听,最好是放在登录方法中,在关闭连接方法中,移除监听,原因是为了避免重复添加监听,接受重复消息

退出程序应该关闭连接,移除监听,该监听可以接受所有好友的消息,很方便吧~

[java] view
plain
copy

  1. TaxiChatManagerListener chatManagerListener = new TaxiChatManagerListener();
  2. getConnection().getChatManager().addChatListener(chatManagerListener);
[java] view
plain
copy

  1. connection.getChatManager().removeChatListener(chatManagerListener);

二、多人聊天(会议室)

1)、发送消息

首先要获取会议室对象(MultiUserChat),有两种方法获取

两个方法前面都有讲到,这里再回顾一下

1、创建会议室

[java] view
plain
copy

  1. /**
  2. * 创建房间
  3. *
  4. * @param roomName  房间名称
  5. */
  6. public MultiUserChat createRoom(String user, String roomName,String password) {
  7. if (getConnection() == null)
  8. return null;
  9. MultiUserChat muc = null;
  10. try {
  11. // 创建一个MultiUserChat
  12. muc = new MultiUserChat(getConnection(), roomName + "@conference."
  13. + getConnection().getServiceName());
  14. // 创建聊天室
  15. muc.create(roomName);
  16. // 获得聊天室的配置表单
  17. Form form = muc.getConfigurationForm();
  18. // 根据原始表单创建一个要提交的新表单。
  19. Form submitForm = form.createAnswerForm();
  20. // 向要提交的表单添加默认答复
  21. for (Iterator<FormField> fields = form.getFields(); fields
  22. .hasNext();) {
  23. FormField field = (FormField) fields.next();
  24. if (!FormField.TYPE_HIDDEN.equals(field.getType())
  25. && field.getVariable() != null) {
  26. // 设置默认值作为答复
  27. submitForm.setDefaultAnswer(field.getVariable());
  28. }
  29. }
  30. // 设置聊天室的新拥有者
  31. List<String> owners = new ArrayList<String>();
  32. owners.add(getConnection().getUser());// 用户JID
  33. submitForm.setAnswer("muc#roomconfig_roomowners", owners);
  34. // 设置聊天室是持久聊天室,即将要被保存下来
  35. submitForm.setAnswer("muc#roomconfig_persistentroom", true);
  36. // 房间仅对成员开放
  37. submitForm.setAnswer("muc#roomconfig_membersonly", false);
  38. // 允许占有者邀请其他人
  39. submitForm.setAnswer("muc#roomconfig_allowinvites", true);
  40. if (!password.equals("")) {
  41. // 进入是否需要密码
  42. submitForm.setAnswer("muc#roomconfig_passwordprotectedroom",
  43. true);
  44. // 设置进入密码
  45. submitForm.setAnswer("muc#roomconfig_roomsecret", password);
  46. }
  47. // 能够发现占有者真实 JID 的角色
  48. // submitForm.setAnswer("muc#roomconfig_whois", "anyone");
  49. // 登录房间对话
  50. submitForm.setAnswer("muc#roomconfig_enablelogging", true);
  51. // 仅允许注册的昵称登录
  52. submitForm.setAnswer("x-muc#roomconfig_reservednick", true);
  53. // 允许使用者修改昵称
  54. submitForm.setAnswer("x-muc#roomconfig_canchangenick", false);
  55. // 允许用户注册房间
  56. submitForm.setAnswer("x-muc#roomconfig_registration", false);
  57. // 发送已完成的表单(有默认值)到服务器来配置聊天室
  58. muc.sendConfigurationForm(submitForm);
  59. } catch (XMPPException e) {
  60. e.printStackTrace();
  61. return null;
  62. }
  63. return muc;
  64. }

2、加入会议室,

[java] view
plain
copy

  1. /**
  2. * 加入会议室
  3. *
  4. * @param user
  5. *            昵称
  6. * @param password
  7. *            会议室密码
  8. * @param roomsName
  9. *            会议室名
  10. */
  11. public MultiUserChat joinMultiUserChat(String user, String roomsName,
  12. String password) {
  13. if (getConnection() == null)
  14. return null;
  15. try {
  16. // 使用XMPPConnection创建一个MultiUserChat窗口
  17. MultiUserChat muc = new MultiUserChat(getConnection(), roomsName
  18. + "@conference." + getConnection().getServiceName());
  19. // 聊天室服务将会决定要接受的历史记录数量
  20. DiscussionHistory history = new DiscussionHistory();
  21. history.setMaxChars(0);
  22. // history.setSince(new Date());
  23. // 用户加入聊天室
  24. muc.join(user, password, history,
  25. SmackConfiguration.getPacketReplyTimeout());
  26. Log.i("MultiUserChat", "会议室【"+roomsName+"】加入成功........");
  27. return muc;
  28. } catch (XMPPException e) {
  29. e.printStackTrace();
  30. Log.i("MultiUserChat", "会议室【"+roomsName+"】加入失败........");
  31. return null;
  32. }
  33. }

调用这个两个方法都可以获取到MultiUserChat,根据需求选择一个就可以。

利用MultiUserChat对象调用sendMessage()方法即可,很容易吧~

[java] view
plain
copy

  1. try {
  2. multiUserChat.sendMessage(message);
  3. } catch (XMPPException e) {
  4. e.printStackTrace();
  5. }

2)接受消息

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

[java] view
plain
copy

  1. package com.techrare.listener;
  2. import org.jivesoftware.smack.PacketListener;
  3. import org.jivesoftware.smack.packet.Message;
  4. import org.jivesoftware.smack.packet.Packet;
  5. /**
  6. * 会议室消息监听类
  7. *
  8. * @author Administrator
  9. *
  10. */
  11. public class TaxiMultiListener implements PacketListener {
  12. @Override
  13. public void processPacket(Packet packet) {
  14. Message message = (Message) packet;
  15. String body = message.getBody();
  16. }
  17. }

添加监听器,每个会议室聊天对象都要添加一个消息监听器,为了避免重复监听

应该把会议室聊天对象放在一个集合当中,需要用到的时候取出来用即可。

[java] view
plain
copy

  1. multiUserChat.addMessageListener(new TaxiMultiListener());

openfire Android 学习(四)----单人聊天和多人聊天(发送消息、接收消息)的更多相关文章

  1. Openfire 单人聊天和多人聊天(发送消息、接收消息)

    Openfire 单人聊天和多人聊天(发送消息.接收消息) 一.单人聊天 1)发送消息: 首先要获取一个聊天窗口,getConnection()为获取连接connection的方法,调用getFrie ...

  2. openfire Android学习(三)----会议室创建、加入以及查询会议室中所有成员等

    openfire 中的会议室不像QQ群一样,不能保存那些离线用户,加入会议室后,一旦断开连接,就会离开会议室. 虽然如此,但如果要实现也不是不可能,我们可以自己做后台来保存,有兴趣的可以去试着实现一下 ...

  3. openfire Android学习(六)----总结

    Xmpp的一些方法整理到一个工具类中了 XmppConnection.java [java] view plaincopy [java] view plaincopy import java.io.B ...

  4. Android学习小Demo(19)利用Loader来实时接收短信

    之前写过一篇文章<Android学习小Demo(13)Android中关于ContentObserver的使用>,在里面利用ContentOberver去监測短信URI内容的变化.我们先来 ...

  5. Android Wear开发 - 数据通讯 - 第二节 : 数据的发送与接收

    本节由介绍3种数据的发送接收:1.Data Items : 比特类型数据,限制100KB以内2.Assets : 资源类型数据,大小无上限3.Message : 发送消息,触发指令 http://de ...

  6. openfire Android学习---android客户端聊天开发之登录 和 注销登录

    一切就绪,新建一个android测试工程: 上网权限配置,界面绘制啥的,这里就不说了. 首先 导入一个smark包.这个是用来维护长连接的,也可以是asmark.我用的是asmark 先普及一些基本知 ...

  7. openfire Android学习(一)----实现用户注册、登录、修改密码和注销等

    以前学习过用Scoket 建立聊天,简单的建立聊天是没问题的,但如果要实现多人复杂的聊天,后台服务器代码就比较复杂,对于我这新手来讲就比较难了.后来在网上看到用openfire做服务器,利用强大的Sm ...

  8. android学习四(Activity的生命周期)

    要学好活动(Activity).就必需要了解android中Activity的声明周期.灵活的使用生命周期.能够开发出更好的程序,在android中是使用任务来管理活动的,一个任务就是一组存放在栈里的 ...

  9. android学习四---Activity和Intent

    1.android项目资源深入了解 在深入学习android之前,先好好玩玩手机上的应用,大部分程序都有一个图标,点开图标,程序启动,一定时间后,程序会跳转到第一个界面,比如手机QQ,点开图标,会跳出 ...

随机推荐

  1. cs229课程索引

    重要说明 这个系列是以cs229为参考,梳理下来的有关机器学习传统算法的一些东西.所以说cs229的有些内容我会暂时先去掉放在别的部分里面,也会加上很多重要的,但是cs229没有讲到的东西.而且本系列 ...

  2. Android开发——Android 6.0权限管理机制详解

    .Android 6.0运行时主动请求权限 3.1  检测和申请权限 下面的例子介绍上面列出的读写SD卡的使用例子,可以使用以下的方式解决: public boolean isGrantExterna ...

  3. 【ZABBIX】Linux下安装ZABBIX

    说明:搭建ZABBIX所需的软件列表为:RHEL6.5+Nginx+MySQL+PHP+ZABBIX. 一.软件包 软件名称 版本 下载地址 nginx 1.10.3 http://nginx.org ...

  4. navicat for mysql 在win7下设置定时计划之导出数据处理

    navicat for mysql 在win7下设置定时计划之导出数据处理 博客分类: mysql navitcatmysql定时任务导出  前两篇记录了,navicat for mysql计划的入门 ...

  5. ptyhon - 接口自动化测试实战case1

    work_20181203_httprequest.py: import requestsclass http_request: def http_get(url,params): res = req ...

  6. Pycharm 简单设置

  7. Node.js中的http.request方法的使用说明

    方法说明: 函数的功能室作为客户端向HTTP服务器发起请求. 语法: http.get(options, callback) 由于该方法属于http模块,使用前需要引入http模块(var http= ...

  8. HAZU校赛 Problem K: Deadline

    Problem K: Deadline Time Limit: 2 Sec Memory Limit: 1280 MB Submit: 1106 Solved: 117 [Submit][Status ...

  9. IB_DESIGNABLE 和 IBInspectable 的用法

    我们经常会在用一些自定义 UIView 来完成一些特殊的UI效果,但是怎么让我自定义的 UIView 在 Storyboard 中预览和修改一些自定义参数呢.这就需要用到两个吊吊的东西. IB_DES ...

  10. UVA12206 Stammering Aliens 【SAM 或 二分 + hash】

    题意 求一个串中出现至少m次的子串的最大长度,对于最大长度,求出最大的左端点 题解 本来想练哈希的,没忍住就写了一个SAM SAM拿来做就很裸了 只要检查每个节点的right集合大小是否不小于m,然后 ...