XMPP——Smack[6]离线消息和离线文件的实现
终篇,三天所学所用,也就这些,如果需要大家要自己去查资料研究研究,功能其实可以很强大的
可惜界面做得不好,一大短处,从大一迄今没整好,主要是个人审美不行,哎
毕业季呀毕业季,明天摆摊卖书,再半月就可能和生活四年的兄弟姐妹说再见,考研考公务员工作的,各奔东西了,我也将南下杭州
感慨,天下无不散之筵席
在此祝所有刚毕业的,学业事业有成吧
不废话了,貌似最近太感性了,理科男,伤不起呀
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.
英文退化了点,汗,大意就是,必须在发送在线信息之前去获取离线消息
刚开始没看这个,结果在上线之后,去取,结果。。。。离线消息数量总是为零,囧
首先,连接,状态要设为离线
- ConnectionConfiguration connConfig = new ConnectionConfiguration(serverDomain);
- connConfig.setSendPresence(false); // where connConfig is object of .
- connection = new XMPPConnection(connConfig);
- connection.connect();
然后,登陆
connection.login(userName, pwd);
接着,拿离线消息
- OfflineMessageManager offlineManager = new OfflineMessageManager(
- Client.getConnection());
- try {
- Iterator<org.jivesoftware.smack.packet.Message> it = offlineManager
- .getMessages();
- System.out.println(offlineManager.supportsFlexibleRetrieval());
- System.out.println("离线消息数量: " + offlineManager.getMessageCount());
- Map<String,ArrayList<Message>> offlineMsgs = new HashMap<String,ArrayList<Message>>();
- while (it.hasNext()) {
- org.jivesoftware.smack.packet.Message message = it.next();
- System.out
- .println("收到离线消息, Received from 【" + message.getFrom()
- + "】 message: " + message.getBody());
- String fromUser = message.getFrom().split("/")[0];
- if(offlineMsgs.containsKey(fromUser))
- {
- offlineMsgs.get(fromUser).add(message);
- }else{
- ArrayList<Message> temp = new ArrayList<Message>();
- temp.add(message);
- offlineMsgs.put(fromUser, temp);
- }
- }
- //在这里进行处理离线消息集合......
- Set<String> keys = offlineMsgs.keySet();
- Iterator<String> offIt = keys.iterator();
- while(offIt.hasNext())
- {
- String key = offIt.next();
- ArrayList<Message> ms = offlineMsgs.get(key);
- TelFrame tel = new TelFrame(key);
- ChatFrameThread cft = new ChatFrameThread(key, null);
- cft.setTel(tel);
- cft.start();
- for (int i = 0; i < ms.size(); i++) {
- tel.messageReceiveHandler(ms.get(i));
- }
- }
- offlineManager.deleteMessages();
- } catch (Exception e) {
- e.printStackTrace();
- }
记得最后要把离线消息删除,即通知服务器删除离线消息
offlineManager.deleteMessages();
否则,下次上了消息还存在
接着,上线
Presence presence = new Presence(Presence.Type.available);
connection.sendPacket(presence);
2.离线文件
这个我没实现,汗
主要思想:开发openfire插件,拦截离线文件,将文件存到服务器上,同时在数据库里开一张表,存储文件信息
当用户上线时,查表,若是有,根据路径,拿了发送
当然,大家可以谷歌下是否有相应的插件,时间紧迫,我倒是没找着
到这里,大概就这些了,对了,还扩展了个视频音频聊天,不过使用的是JMF,点对点的,本来打算使用jingle的,结果连API文档都没找到,晕死
就这些
XMPP——Smack[6]离线消息和离线文件的实现的更多相关文章
- 可在广域网部署运行的QQ高仿版 -- GG叽叽V3.2,增加离线消息、离线文件功能(源码)
(几句题外话:虽然就如何将GG发展为一个有商业价值的产品,我还没有很清晰明确的思路,但是从GG发布以来,通过GG认识了一些朋友,也接了一些小单子,赚了一点小钱.有了一点甜头,目前和2.3个好朋友一起做 ...
- XMPP——Smack[5]文件传输及离线消息的获取
三天时间,赶在最后一下午实现了文件的传输,本来需要实现离线文件的发送的,一直没想好怎么弄,找openfire的离线文件插件没找到,后来想出一种方法,起服务器时起了一个系统用户,一直在线,当用户发送离线 ...
- Asmack离线消息时间获取
DelayInformation info = (DelayInformation)message.getExtension("x","jabber:x:delay&qu ...
- XMPP——Smack[1]连接、登陆及账户操作
临毕业前,应需求,花了三天写了个小的聊天工具,貌似简陋得很….若有机会再完善吧,目前毕业季,处理毕业事宜,还要准备即将的入职. 眼瞅着大学四年就这么结束了,哎. 开始吧,四篇博文简单介绍下基本实现,由 ...
- Xmpp获取离线消息
文章只是选取了其中一段,无XMPP基础的人可能看起来有点复杂; 假设我们注册了一个用户,用户名叫shimiso,那么我们如何让shimiso这个用户一登陆就取到离线消息呢? PPConnection. ...
- 基于ejabberd简单实现xmpp群聊离线消息
首先,xmpp服务器是基于ejabberd.离线消息模块是mod_interact,原地址地址:https://github.com/adamvduke/mod_interact: 修改后实现群聊离线 ...
- asmack xmpp 获取离线消息
原文:http://plplum.blog.163.com/blog/static/31032400201503015345948/ 注意事项: 1.登录前要将状态设置为离线: ConnectionC ...
- xmpp和OpenFire示例,即时聊天室,支持离线消息
让我说说为什么写这个博客,这是因为我在上周末的研究XMPP和OpenFire,从互联网上下载Demo,但跑不起来.它花了很长的时间.它被改造.抬高.篇博文也是希望后边学习XMPP和OpenFire的同 ...
- IM消息送达保证机制实现(二):保证离线消息的可靠投递
1.前言 本文的上篇<IM消息送达保证机制实现(一):保证在线实时消息的可靠投递>中,我们讨论了在线实时消息的投递可以通过应用层的确认.发送方的超时重传.接收方的去重等手段来保证业务层面消 ...
随机推荐
- C++11内存模型的粗略解释
基本解释 C++11引入了多线程,同时也引入了一套内存模型.从而提供了比较完善的一套多线程体系.在单线程时代,一切都很简单.没有共享数据,没有乱序执行,所有的指令的执行都是按照预定的时间线.但是也正是 ...
- 退出myeclipse 8.5配置中心
用myeclipse 8.5没多久,进入软件中心下载插件,找不到退出按钮,唉,木想到就是一图标.
- cdev[典]
linux-2.6.22/include/linux/cdev.hstruct cdev { struct kobject kobj; // 每个 cdev 都是一个 kobje ...
- 【POJ】3468 A Simple Problem with Integers
这题用线段树轻松解了,重新用树状数组解,关键点是区间更新.公式推导如下:sum[x] = org_sum[x] + delta[1]*x + delta[2]*(x-1) + delta[x]*1 ...
- Android开发之一些资源索引
1.android标题栏(titlebar)显示进度条 protected void onCreate(Bundle savedInstanceState) { super.onCreate(save ...
- asp mvc 路由
public override void RegisterArea(AreaRegistrationContext context) { context.MapRoute( "Workflo ...
- 如何在一个frame中调用另一个frame中的javascript函数
1.htm <script language="javascript">function test(){alert("测试")}</scrip ...
- 【原】android通过adb wireless的使用
开发android程序,总是需要插拔插拔的,usb口都给弄坏掉了,现在adb可以通过无线网,链接处在同一个局域网下面的android设备 1.将电脑和移动设备链接到同一个无线网下 2.在android ...
- JS分页 + 获取MVC地址栏URL路径的最后参数
@{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport&quo ...
- volatile之一--volatile不能保证原子性
Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 同步块 和 volatile 关键字机制在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这 ...