openfire+spark+smack 即时通讯(问题篇一)离线消息获取不到

即时通信功能已经开发完毕,现在还木有时间整理,打算后期抽时间整理后发一下源码跟教程。现在记录一下遇到的问题,首先是获取离线消息。

OfflineMessageManager是官方获取离线消息的,但是直接获取,是获取不到任何消息的,需要先设置离线,然后获取后,再上线。功能代码如下。

1、离线

// 初始化
	public XMPPConnection init(LoginConfig loginConfig) {
		Connection.DEBUG_ENABLED = false;
		ProviderManager pm = ProviderManager.getInstance();
		configure(pm);

		connectionConfig = new ConnectionConfiguration(
				loginConfig.getXmppHost(), loginConfig.getXmppPort(),
				loginConfig.getXmppServiceName());
		connectionConfig.setSASLAuthenticationEnabled(false);// 不使用SASL验证,设置为false
		connectionConfig
				.setSecurityMode(ConnectionConfiguration.SecurityMode.enabled);
		// 允许自动连接
		connectionConfig.setReconnectionAllowed(false);
		connectionConfig.setSendPresence(false);// 设置离线
		// 收到好友邀请后manual表示需要经过同意,accept_all表示不经同意自动为好友
		Roster.setDefaultSubscriptionMode(Roster.SubscriptionMode.manual);
		connection = new XMPPConnection(connectionConfig);
		return connection;
	}

2、获取消息

OfflineMessageManager offlineManager = new OfflineMessageManager(connection);
		try {
			Log.i("离线消息数量: ", "" + offlineManager.getMessageCount());
			Iterator<org.jivesoftware.smack.packet.Message> it = offlineManager.getMessages();

			while (it.hasNext()) {
				org.jivesoftware.smack.packet.Message message = it.next();
				Log.i("收到离线消息", "Received from 【" + message.getFrom()
						+ "】 message: " + message.getBody());
				if (message != null && message.getBody() != null
						&& !message.getBody().equals("null")) {
					IMMessage msg = new IMMessage();
					String time = (String) message
							.getProperty(IMMessage.KEY_TIME);
					msg.setTime(time == null ? DateUtil.getCurDateStr() : time);
					msg.setContent(message.getBody());
					if (Message.Type.error == message.getType()) {
						msg.setType(IMMessage.ERROR);
					} else {
						msg.setType(IMMessage.SUCCESS);
					}
					String from = message.getFrom().split("/")[0];
					msg.setFromSubJid(from);

					// 生成通知
					NoticeManager noticeManager = NoticeManager
							.getInstance(context);
					Notice notice = new Notice();
					notice.setTitle("新信息");
					notice.setNoticeType(Notice.CHAT_MSG);
					notice.setContent(message.getBody());
					notice.setFrom(from);
					notice.setStatus(Notice.UNREAD);
					notice.setNoticeTime(time == null ? DateUtil
							.getCurDateStr() : time);

					// 历史记录
					IMMessage newMessage = new IMMessage();
					newMessage.setMsgType(0);
					newMessage.setFromSubJid(from);
					newMessage.setContent(message.getBody());
					newMessage.setTime(time == null ? DateUtil.getCurDateStr()
							: time);
					MessageManager.getInstance(context).saveIMMessage(
							newMessage);

					long noticeId = noticeManager.saveNotice(notice);
					if (noticeId != -1) {
						Intent intent = new Intent(Constant.NEW_MESSAGE_ACTION);
						intent.putExtra(IMMessage.IMMESSAGE_KEY, msg);
						intent.putExtra("noticeId", noticeId);
						context.sendBroadcast(intent);
						activitySupport.setNotiType(
								R.drawable.ic_launcher,
								context.getResources().getString(
										R.string.new_message),
								notice.getContent(), ChatActivity.class, from);
					}
				}
			}

			offlineManager.deleteMessages();// 通知服务器删除离线消息
		} catch (Exception e) {
			e.printStackTrace();
		}

3、设置上线:

Presence presence = new Presence(Presence.Type.available);
        connection.sendPacket(presence);
时间: 2024-09-29 22:17:59

openfire+spark+smack 即时通讯(问题篇一)离线消息获取不到的相关文章

openfire+spark+smack 即时通讯(一)---Openfire 的安装和配置

openfire是一个即时通讯服务器,也称之为即时通讯平台.它是基于XMPP协议的,大家所熟悉的通讯软件QQ.MSN和Gtalk等等,其中Gtalk就是基于XMPP协议的实现. 在即时通讯中往往因为需要保存一些状态或者数据所以不能采用点对点通讯,而是需要搭建服务器来转发. 下载地址:http://www.igniterealtime.org/downloads/index.jsp 下载完毕以后根据提示安装.配置,然后访问所配置的服务器地址上的9090端口即可访问官方为我们实现好了的openfir

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

让我说说为什么写这个博客,这是因为我在上周末的研究XMPP和OpenFire,从互联网上下载Demo,但跑不起来.它花了很长的时间.它被改造.抬高.篇博文也是希望后边学习XMPP和OpenFire的同学下载后直接执行.少走弯路了.时间就是金钱,不要花费不必要的时间,也希望大家都能有分享精神.,有问题能够发邮件给我([email protected]) 关于xmpp和openfire的资料请百度百科一下 下面展示一个聊天程序.所谓万事都要有Helloworld嘛,这个demo能够做为学习xmpp和

openfire+spark+smack实现即时通讯

近公司项目需要用到即时通讯功能,经过调研发现openfire+spark+smack可以实现.在网上找了很久,资料都十分有限,即使有些朋友实现了也说的不清不楚.于是决定自己研究,耗时一周的时间实现了文字通讯和文件传输的功能.现发帖分享给有需要的朋友,也希望大家能够把自己的资料都分享出来,不要敝扫自珍. 废话说够了,现在开始上干货: 1.openfire是什么?openfire是一个即时通讯服务器,也称之为即时通讯平台.它是基于XMPP协议的,大家所熟悉的通讯软件QQ.MSN和Gtalk等等,其中

基于openfire+smack即时通讯instant message开发

前言 Java领域的即时通信的解决方案可以考虑openfire+spark+smack.当然也有其他的选择. Openfire 是基于Jabber协议(XMPP)实现的即时通信服务器端版本,目前建议使用3.8.1版本,这个版本是当前最新的版本,而且网上可以找到下载的源代码. 即时通信客户端可使用spark2.6.3,这个版本是目前最新的release版本,经过测试发现上一版本在视频支持,msn网关支持上可能有问题,所以选择openfire3.8.1+spark2.6.3是最合适的选择. Smac

Openfire/Spark/Smack

Openfire, Spark, Smack 是Java实现的基于XMPP协议的企业级IM解决方案. Openfire:实现XMPP协议的IM服务器.有自己的管理web. Openfire数据表描述: http://www.igniterealtime.org/builds/openfire/docs/latest/documentation/database-guide.html#ofUser#ofUser Spark: 实现XMPP协议的IM客户端.是一个插件框架,可以开发插件以提供新功能.

技术笔记:XMPP之openfire+spark+smack

在即时通信这个领域目前只找到一个XMPP协议,在其协议基础上还是有许多成熟的产品,而且是开源的.所以还是想在这个领域多多了解一下. XMPP协议:具体的概念我就不写了,毕竟这东西网上到处是.简单的说就是基于XML的一种协议.其解决了什么问题呢?就是给即时通讯制定了标准,大家只要遵守标准就可以完成即时通信的功能.有了标准的好处就是可以有各种不同的实现,大家在这个标准上发展自己的特长.而且还给即时通信提供了互联互通的基础.XMPP协议据网上说还是比较优秀的,表现就是google等大公司都在自己的即时

即时通讯之smack客户端配置

之前学习了通过Openfire+spark+smack的模式来完成我们的即时通讯软件,上次我们已经完成了Openfire的安装和配置,这次我们继续完成我们的客户端部分. 1.首先我们通过百度smack来下载我们所需要的jar包,将下载好的jar包导入到我们的工程中,创建一个工具类XmppTool: package com.xmpp.client.util; import org.jivesoftware.smack.ConnectionConfiguration; import org.jive

即时通讯技术- 推送技术协议方案

C2DM云端推送方案 在Android手机平台上,Google 提供了 C2DM(Cloudto Device Messaging)服务.Android Cloud to Device Messaging (C2DM)是一个 用来帮助开发者从服务器向Android应用程序发送数据的服务.该服务提供了一个简单的.轻量级的机制,允许服务器可以通知移动应 用程序直接与服务器进行通信,以便于从服务器获取应用程序更新和用户数据. 该方案存在的主要问题是C2DM需要依赖于Google官方提供的C2DM服务器

[Python]实现XMPP协议即时通讯发送消息功能

#-*- coding: utf-8 -*- __author__ = 'tsbc' import xmpp import time #注意帐号信息,必须加@域名格式 from_user = '[email protected]' password = 'a1b2c3d4' #可以添加多个接收人 to_user = ['[email protected]'] msg = "您好!这是条测试信息!" def to_msg(): """ 基于xmpp协议的即时