终篇,三天所学所用,也就这些,如果需要大家要自己去查资料研究研究,功能其实可以很强大的

可惜界面做得不好,一大短处,从大一迄今没整好,主要是个人审美不行,哎

毕业季呀毕业季,明天摆摊卖书,再半月就可能和生活四年的兄弟姐妹说再见,考研考公务员工作的,各奔东西了,我也将南下杭州

感慨,天下无不散之筵席

在此祝所有刚毕业的,学业事业有成吧

不废话了,貌似最近太感性了,理科男,伤不起呀

1.离线消息

openfire本身是支持离线消息的,不需要进行额外处理,可以用spark测试下

使用smack,其实他提供了相应的方法

Class OfflineMessageManager

可以看下描述

The OfflineMessageManager helps manage offline messages even before the user has sent an available presence. When a user asks for his offline messages before sending an available presence then the server will not send a flood with all the offline messages when the user becomes online. The server will not send a flood with all the offline messages to the session that made the offline messages request or to any other session used by the user that becomes online.

英文退化了点,汗,大意就是,必须在发送在线信息之前去获取离线消息

刚开始没看这个,结果在上线之后,去取,结果。。。。离线消息数量总是为零,囧

首先,连接,状态要设为离线

  1. ConnectionConfiguration connConfig = new ConnectionConfiguration(serverDomain);
  2. connConfig.setSendPresence(false); // where connConfig is object of .
  3. connection = new XMPPConnection(connConfig);
  4. connection.connect();

然后,登陆

connection.login(userName, pwd);

接着,拿离线消息

  1. OfflineMessageManager offlineManager = new OfflineMessageManager(
  2. Client.getConnection());
  3. try {
  4. Iterator<org.jivesoftware.smack.packet.Message> it = offlineManager
  5. .getMessages();
  6. System.out.println(offlineManager.supportsFlexibleRetrieval());
  7. System.out.println("离线消息数量: " + offlineManager.getMessageCount());
  8. Map<String,ArrayList<Message>> offlineMsgs = new HashMap<String,ArrayList<Message>>();
  9. while (it.hasNext()) {
  10. org.jivesoftware.smack.packet.Message message = it.next();
  11. System.out
  12. .println("收到离线消息, Received from 【" + message.getFrom()
  13. + "】 message: " + message.getBody());
  14. String fromUser = message.getFrom().split("/")[0];
  15. if(offlineMsgs.containsKey(fromUser))
  16. {
  17. offlineMsgs.get(fromUser).add(message);
  18. }else{
  19. ArrayList<Message> temp = new ArrayList<Message>();
  20. temp.add(message);
  21. offlineMsgs.put(fromUser, temp);
  22. }
  23. }
  24. //在这里进行处理离线消息集合......
  25. Set<String> keys = offlineMsgs.keySet();
  26. Iterator<String> offIt = keys.iterator();
  27. while(offIt.hasNext())
  28. {
  29. String key = offIt.next();
  30. ArrayList<Message> ms = offlineMsgs.get(key);
  31. TelFrame tel = new TelFrame(key);
  32. ChatFrameThread cft = new ChatFrameThread(key, null);
  33. cft.setTel(tel);
  34. cft.start();
  35. for (int i = 0; i < ms.size(); i++) {
  36. tel.messageReceiveHandler(ms.get(i));
  37. }
  38. }
  39. offlineManager.deleteMessages();
  40. } catch (Exception e) {
  41. e.printStackTrace();
  42. }

记得最后要把离线消息删除,即通知服务器删除离线消息

offlineManager.deleteMessages();

否则,下次上了消息还存在

接着,上线

Presence presence = new Presence(Presence.Type.available);
        connection.sendPacket(presence);

2.离线文件

这个我没实现,汗

主要思想:开发openfire插件,拦截离线文件,将文件存到服务器上,同时在数据库里开一张表,存储文件信息

当用户上线时,查表,若是有,根据路径,拿了发送

当然,大家可以谷歌下是否有相应的插件,时间紧迫,我倒是没找着

到这里,大概就这些了,对了,还扩展了个视频音频聊天,不过使用的是JMF,点对点的,本来打算使用jingle的,结果连API文档都没找到,晕死

就这些

XMPP——Smack[6]离线消息和离线文件的实现的更多相关文章

  1. 可在广域网部署运行的QQ高仿版 -- GG叽叽V3.2,增加离线消息、离线文件功能(源码)

    (几句题外话:虽然就如何将GG发展为一个有商业价值的产品,我还没有很清晰明确的思路,但是从GG发布以来,通过GG认识了一些朋友,也接了一些小单子,赚了一点小钱.有了一点甜头,目前和2.3个好朋友一起做 ...

  2. XMPP——Smack[5]文件传输及离线消息的获取

    三天时间,赶在最后一下午实现了文件的传输,本来需要实现离线文件的发送的,一直没想好怎么弄,找openfire的离线文件插件没找到,后来想出一种方法,起服务器时起了一个系统用户,一直在线,当用户发送离线 ...

  3. Asmack离线消息时间获取

    DelayInformation info = (DelayInformation)message.getExtension("x","jabber:x:delay&qu ...

  4. XMPP——Smack[1]连接、登陆及账户操作

    临毕业前,应需求,花了三天写了个小的聊天工具,貌似简陋得很….若有机会再完善吧,目前毕业季,处理毕业事宜,还要准备即将的入职. 眼瞅着大学四年就这么结束了,哎. 开始吧,四篇博文简单介绍下基本实现,由 ...

  5. Xmpp获取离线消息

    文章只是选取了其中一段,无XMPP基础的人可能看起来有点复杂; 假设我们注册了一个用户,用户名叫shimiso,那么我们如何让shimiso这个用户一登陆就取到离线消息呢? PPConnection. ...

  6. 基于ejabberd简单实现xmpp群聊离线消息

    首先,xmpp服务器是基于ejabberd.离线消息模块是mod_interact,原地址地址:https://github.com/adamvduke/mod_interact: 修改后实现群聊离线 ...

  7. asmack xmpp 获取离线消息

    原文:http://plplum.blog.163.com/blog/static/31032400201503015345948/ 注意事项: 1.登录前要将状态设置为离线: ConnectionC ...

  8. xmpp和OpenFire示例,即时聊天室,支持离线消息

    让我说说为什么写这个博客,这是因为我在上周末的研究XMPP和OpenFire,从互联网上下载Demo,但跑不起来.它花了很长的时间.它被改造.抬高.篇博文也是希望后边学习XMPP和OpenFire的同 ...

  9. IM消息送达保证机制实现(二):保证离线消息的可靠投递

    1.前言 本文的上篇<IM消息送达保证机制实现(一):保证在线实时消息的可靠投递>中,我们讨论了在线实时消息的投递可以通过应用层的确认.发送方的超时重传.接收方的去重等手段来保证业务层面消 ...

随机推荐

  1. python lambda 用法

    可以视lambda为一个简易的函数,它不需要return,形式简单 #冒号左边是变量 #冒号右边是返回值 例: >>> def f (x): return x**2 ... > ...

  2. MySQL数据库乱码 - Linux下乱码问题一

    乱码问题是很让人抓狂的问题,下面我将记录一下linux下mysql乱码问题的解决方法. mysql在linux下乱码问题 一.操作 mysql默认字符集是latin1,但是我们大部分程序使用的字符集是 ...

  3. 【HDOJ】3473 Minimum Sum

    划分树解.主席树解MLE. /* 3473 */ #include <iostream> #include <sstream> #include <string> ...

  4. 【HDOJ】3601 Coach Yehr’s punishment

    RMQ+dp+二分.最好还是离散化一下再处理,通过dp求得每个位置的上一次出现的位置pre数组,从而求得不重复的长度len.然后RMQ可以预处理区间的最大值,pre是个单调非递减数列.每次查询时,二分 ...

  5. write_chip,read_chip

    int write_chip(UINT32 addr, UINT32 data) { if(0 == fpgaRWMode) /* localbus mode */ { UINT16 datah, d ...

  6. [原]Unity3D深入浅出 - 认识开发环境中的Component(组件)菜单

    Component(组件)是用来添加到GameObject对象上的一组相关属性,本质上每个组件都是一个类的实例,比如在Cube上添加一个Mesh网格,即面向对象的思维方式可以理解成Cube对象里包含了 ...

  7. [原]Unity3D深入浅出 - 认识开发环境中的RenderSettings面板

    点击菜单栏的Edit项里的RenderSettings即可打开该面板. Fog:在Scene中开启雾效果 Fog Color:雾的颜色 Fog Mode:雾效果的模式,Linear(线性雾效果) Ex ...

  8. 如何从Linux源码获知版本信息

    /*************************************************************************** * 如何从Linux源码获知版本信息 * 声明 ...

  9. 嵌入式Linux启动过程中的问题积累

    嵌入式Linux启动过程中的问题积累 Dongas 07-12-19 1.Bad Magic Number ## Booting image at 33000000 ... Bad Magic Num ...

  10. 使用CSS3美化复选框checkbox

    我们知道HTML默认的复选框样式十分简陋,而以图片代替复选框的美化方式会给页面表单的处理带来麻烦,那么本文将结合实例带您一起了解一下使用CSS3将复选框checkbox进行样式美化,并且带上超酷的滑动 ...