当前位置:首页 » 操作系统 » XMPP安卓源码

XMPP安卓源码

发布时间: 2023-07-19 03:54:32

① 如何写一个MQTT连接的android客户端

MQTT是一个轻量级的消息发布/订阅协议,它是实现基于手机客户端的消息推送服务器的理想解决方案。 我们可以从这里下载该项目的实例代码,并且可以找到一个采用php书写的服务器端实现。 架构如下所示: wmqtt.jar 是IBM提供的MQTT协议的实现。你可以从如下站点下载它。你可以将该jar包加入你自己的Android应用程序中。 Really Small Message Broker (RSMB) ,他是一个简单的MQTT代理,同样由IBM提供。缺省打开1883端口,应用程序当中,它负责接收来自服务器的消息并将其转发给指定的移动设备。 SAM是一个针对MQTT写的PHP库。你可以从这个下载它. send_mqtt.php是一个通过POST接收消息并且通过SAM将消息发送给RSMB的PHP脚本。 实例代码: Ø 采用XMPP协议实现Android推送 这是我在项目中采用的方案。事实上Google官方的C2DM服务器底层也是采用XMPP协议进行的封装。 XMPP(可扩展通讯和表示协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线探测。这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息。 androidpn是一个基于XMPP协议的java开源Android push notification实现。它包含了完整的客户端和服务器端。经过源代码研究我发现,该服务器端基本是在另外一个开源工程openfire基础上修改实现的,不过比较郁闷的是androidpn的文档是由韩语写的,所以整个研究过程基本都是读源码。它的实现示意图如下: androidpn客户端需要用到一个基于java的开源XMPP协议包asmack,这个包同样也是基于openfire下的另外一个开源项目smack,不过我们不需要自己编译,可以直接把androidpn客户端里面的asmack.jar拿来使用。客户端利用asmack中提供的XMPPConnection类与服务器建立持久连接,并通过该连接进行用户注册和登录认证,同样也是通过这条连接,接收服务器发送的通知。 androidpn服务器端也是java语言实现的,基于openfire开源工程,不过它的Web部分采用的是spring框架,这一点与openfire是不同的。Androidpn服务器包含两个部分,一个是侦听在5222端口上的XMPP服务,负责与客户端的XMPPConnection类进行通信,作用是用户注册和身份认证,并发送推送通知消息。另外一部分是Web服务器,采用一个轻量级的HTTP服务器,负责接收用户的Web请求。服务器架构如下: 最上层包含四个组成部分,分别是SessionManager,Auth Manager,PresenceManager以及Notification Manager。SessionManager负责管理客户端与服务器之间的会话,Auth Manager负责客户端用户认证管理,Presence Manager负责管理客户端用户的登录状态,NotificationManager负责实现服务器向客户端推送消息功能。 服务器端界面如下,分别对应了上述的几个功能模块: 发送以后,我们可以在手机端看到接收的消息:

② 怎么实现服务器给android客户端主动推送消息

一、消息推送基础
消息推送,就是在互联网上通过定期传送用户需要的信息来减少信息过载的一项新技术。推送技术通过自动传送信息给用户,来减少用于网络上搜索的时间。它根据用户的兴趣来搜索、过滤信息,并将其定期推给用户,帮助用户高效率地发掘有价值的信息
当我们开发需要和服务器交互的移动应用时,基本上都需要和服务器进行交互,包括上传数据到服务器,同时从服务器上获取数据。
一般情况下,客户端与服务器之间通讯客户端是主动的,但这就存在一个问题就是一旦服务器数据有更新或者服务器要下发通知给客户端只能等客户端连接的时候才能实现。这种方式使消息失去了实时性。
如何使客户端能够实时的收到服务器的消息和通知,总体来说有两种方式,第一种是客户端使用Pull(拉)的方式,就是隔一段时间就去服务器上获取一下信息,看是否有更新的信息出现。第二种就是 服务器使用Push(推送)的方式,当服务器端有新信息了,则把最新的信息Push到客户端上。这样,客户端就能自动的接收到消息。 
虽然Pull和Push两种方式都能实现获取服务器端更新信息的功能,但是明显来说Push方式比Pull方式更优越。因为Pull方式更费客户端的网络流量,更主要的是费电量,还需要我们的程序不停地去监测服务端的变化。  
二、几种常见的解决方案实现原理
1)轮询(Pull)方式:客户端定时向服务器发送询问消息,一旦服务器有变化则立即同步消息。
2)SMS(Push)方式:通过拦截SMS消息并且解析消息内容来了解服务器的命令,但这种方式一般用户在经济上很难承受。
3)持久连接(Push)方式:客户端和服务器之间建立长久连接,这样就可以实现消息的及时行和实时性。
三、消息推送解决方案概述
A、C2DM云端推送方案
在Android手机平台上,Google提供了C2DM(Cloudto Device Messaging)服务。Android Cloud to Device Messaging (C2DM)是一个用来帮助开发者从服务器向Android应用程序发送数据的服务。该服务提供了一个简单的、轻量级的机制,允许服务器可以通知移动应用程序直接与服务器进行通信,以便于从服务器获取应用程序更新和用户数据。
该方案存在的主要问题是C2DM需要依赖于Google官方提供的C2DM服务器,由于国内的网络环境,这个服务经常不可用。
B、MQTT协议实现Android推送
采用MQTT协议实现Android推送功能也是一种解决方案。MQTT是一个轻量级的消息发布/订阅协议,它是实现基于手机客户端的消息推送服务器的理想解决方案。
wmqtt.jar 是IBM提供的MQTT协议的实现。我们可以从这里(https://github.com/toku/AndroidPushNotificationsDemo)下载该项目的实例代码,并且可以找到一个采用PHP书写的服务器端实现(https://github.com/toku/PhpMQTTClient)。
C、RSMB实现推送功能
Really Small Message Broker (RSMB) ,是一个简单的MQTT代理,同样由IBM提供,其查看地址是:http://www.alphaworks.ibm.com/tech/rsmb。缺省打开1883端口,应用程序当中,它负责接收来自服务器的消息并将其转发给指定的移动设备。SAM是一个针对MQTT写的PHP库。我们可以从这个http://pecl.php.net/package/sam/download/0.2.0地址下载它.
D、XMPP协议实现Android推送
Google官方的C2DM服务器底层也是采用XMPP协议进行的封装。XMPP(可扩展通讯和表示协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线探测。这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息。
androidpn是一个基于XMPP协议的java开源Android push notification实现。它包含了完整的客户端和服务器端。但也存在一些不足之处:
1) 比如时间过长时,就再也收不到推送的信息了。
2)性能上也不够稳定。
3)如果将消息从服务器上推送出去,就不再管理了,不管消息是否成功到达客户端手机上。
如果我们要使用androidpn,则还需要做大量的工作,需要理解XMPP协议、理解Androidpn的实现机制,需要调试内部存在的BUG。
E、使用第三方平台
目前国内、国外有一些推送平台可供使用,但是涉及到收费问题、保密问题、服务质量问题、扩展问题等等,又不得不是我们望而却步。
四、消息推送完美方案
综合以上论述,在建立Android消息推送方面可谓方案多多,但每一款方案都有其优缺点。但无论如何,还是自己搭建一个推送平台是上策。因为你有、他有不如自己有。
举个例子,在搭建自有推送平台上建议使用《某某Android消息推送组件》。该组不仅可以拿来即用,并且还可以提供源码以便扩展,实现自己的特殊需求。
A、推送原理
Android消息推送组件基于XMPP协议实现Android推送。XMPP(可扩展通讯和表示协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线探测。这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息。

③ 如何自己搭建一个xmpp,实现推送消息

Android推送方案分析(MQTT/XMPP/GCM)
蜗牛TT 发布于 4个月前,共有 11 条评论
本文主旨在于,对目前Android平台上最主流的几种消息推送方案进行分析和对比,比较客观地反映出这些推送方案的优缺点,帮助大家选择最合适的实施方案。
方案1、使用GCM服务(Google Cloud Messaging)
简介:Google推出的云消息服务,即第二代的G2DM。
优点:Google提供的服务、原生、简单,无需实现和部署服务端。
缺点:Android版本限制(必须大于2.2版本),该服务在国内不够稳定、需要用户绑定Google帐号,受限于Google。

方案2、使用XMPP协议(Openfire + Spark + Smack)
简介:基于XML协议的通讯协议,前身是Jabber,目前已由IETF国际标准化组织完成了标准化工作。
优点:协议成熟、强大、可扩展性强、目前主要应用于许多聊天系统中,且已有开源的Java版的开发实例androidpn。
缺点:协议较复杂、冗余(基于XML)、费流量、费电,部署硬件成本高。

方案3、使用MQTT协议(更多信息见:http://mqtt.org/)
简介:轻量级的、基于代理的“发布/订阅”模式的消息传输协议。
优点:协议简洁、小巧、可扩展性强、省流量、省电,目前已经应用到企业领域(参考:http://mqtt.org/software),且已有C++版的服务端组件rsmb。
缺点:不够成熟、实现较复杂、服务端组件rsmb不开源,部署硬件成本较高。

方案4、使用HTTP轮循方式
简介:定时向HTTP服务端接口(Web Service API)获取最新消息。
优点:实现简单、可控性强,部署硬件成本低。
缺点:实时性差。

对各个方案的优缺点的研究和对比,推荐使用MQTT协议的方案进行实现,主要原因是:MQTT最快速,也最省流量(固定头长度仅为2字节),且极易扩展,适合二次开发。接下来,我们就来分析使用MQTT方案进行Android消息的原理和方法,并架设自己的推送服务。

如果还不明白的 话,要看分析的话,给你个网址:http://m.oschina.net/blog/82059
自己看看。

④ 如何实现消息推送功能

?可以用第三方软件极光推送来实现。对于定制化需求较强的,或者想拥有自己推送平台的开发者,极光提供全功能的私有云方案。
极光推送快速开始步骤: 1、到极光推送官方网站注册开发者帐号;
2、登录进入管理控制台,创建应用程序,得到 Appkey(SDK 与服务器端通过 Appkey 互相识别);
3、在推送设置中给 Android 设置包名、给 iOS 上传证书、启用 WinPhone,根据你的需求进行选择;
4、下载 SDK 集成到 App 里。
客户端初始化 JPush 成功后,JPush 服务端会分配一个 Registration ID,作为此设备的标识(同一个手机不同 App 的 Registration ID 是不同的)。开发者可以通过指定具体的 Registration ID 来进行对单一设备的推送。

⑤ openfire怎么不修改源码加入消息回执

遵循原则:
1.message 消息的id由服务端或者客户端统一生成,采用全球唯一id生成策略。
2.客户端收到 message消息后必须回执服务端
3.取消openfire服务器消息总是存储的设置
4.设置openfire离线表ofoffline的messageId字段为字符串类型
实现:
创建openfire组件类:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xmpp.component.Component;
import org.xmpp.component.ComponentException;
import org.xmpp.component.ComponentManager;
import org.xmpp.packet.JID;
import org.xmpp.packet.Message;
import org.xmpp.packet.Packet;

/**
* 处理 回执信息
*
* @author longyingan
*
*/
public class ReceiptComponent implements Component {
private static final Logger log = LoggerFactory.getLogger(ReceiptComponent.class);

private final static String name = "receiptComponent";

@Override
public String getDescription() {
return null;
}

@Override
public String getName() {
return name;
}

@Override
public void initialize(JID jid, ComponentManager componentManager)
throws ComponentException {

}

@Override
public void processPacket(Packet packet) {

if (packet instanceof Message) {
if (packet.getTo() != null
&& packet.getTo().getDomain()
.startsWith("receipt")) { // 群消息回执
Message message = (Message) packet.createCopy();
// 获取消息 id 和 用户
String messageId = message.getID();
String username = message.getFrom().getNode();
// 删除离线消息
if (!StringUtils.isEmpty(messageId)){
//TODO 删除openfire离线表的对应数据
}
}
}
}

@Override
public void shutdown() {

}

@Override
public void start() {

}

}

创建消息拦截类,把所有message消息存储离线:

import java.util.Date;
import java.util.Random;
import java.util.UUID;

import org.apache.commons.lang.StringUtils;
import org.dom4j.Element;
import org.dom4j.QName;
import org.jivesoftware.openfire.XMPPServer;
import org.jivesoftware.openfire.interceptor.PacketInterceptor;
import org.jivesoftware.openfire.interceptor.PacketRejectedException;
import org.jivesoftware.openfire.session.Session;
import org.jivesoftware.util.XMPPDateTimeFormat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xmpp.packet.JID;
import org.xmpp.packet.Message;
import org.xmpp.packet.Packet;

/**
* 搜索引擎拦截器
* @author longyingan
*
*/
public class SearchEngineInterceptor implements PacketInterceptor {

private static final Logger log = LoggerFactory.getLogger(SearchEngineInterceptor.class);
Random m_rndGen = new Random();
@Override
public void interceptPacket(Packet packet, Session session,
boolean incoming, boolean processed) throws PacketRejectedException {

// 程序执行中;是否为结束或返回状态(是否是当前session用户发送消息)
if (processed || !incoming) {
return;
}

if (packet instanceof Message) {
if(packet.getTo()!=null
&& !XMPPServer.getInstance().getServerInfo().getXMPPDomain().equals(packet.getTo().getDomain())
||("receipt."+XMPPServer.getInstance().getServerInfo().getXMPPDomain()).equals(packet.getFrom().getDomain()))
return ;

//TODO 1.存储消息到openfire 离线表
//TODO 2.如果message 没有 id 则产生一个保持
//TODO 3.根据自己的业务判断哪些需要存储,哪些不需要

}
}

}

好,到这来服务端的两个主要类代码已经完成。下面写个客户端如何测试的例子(只是一个简单事例,可能用的时候不是这样的哈):

Chat chat = ChatManager.getInstanceFor(connection).createChat(
"xxx服务器的域", new MessageListener() {
public void processMessage(Chat chat,Message message) {
System.out.println(message.toXML());
Message rep = new Message();
rep.setFrom(message.getTo());
rep.setTo("receipt." + message.getFrom());
rep.setPacketID(message.getPacketID());
rep.setBody("null");
rep.setType(Type.chat);
try {
connection.sendPacket(rep);
} catch (NotConnectedException e1) {
e1.printStackTrace();
}
}
});

⑥ netty 是不是 xmpp服务器

1、可以使用openfire,以前做项目用过,必要时可以修改源码满足需求。
2、现在做IM第三方的API有很多。如环信,极推等。
3、Socket socket = new Socket();
socket .connect(new InetSocketAddress(host, port), 20000);
socket .setSoTimeout(45000);
byte[] byte = date;//你要传输的数据
BufferedInputStream is = new BufferedInputStream(socket.getInputStream(), 512);
DataInputStream dis = new DataInputStream(is);
out = new BufferedOutputStream(socket.getOutputStream());
out.write(bytes);
服务端写个socketServer监听客户端的请求就可以了
如果你想做复杂点儿,还可以扩展个私有协议

⑦ androidpn服务端源码修改后怎么编译

1.服务器:
ConfigManager--配置信息加载类,
Config--配置信息管理类,可以得到配置文件中指定属性的值;
CopyMessageUtil--将IQ中的id得到赋值给回执对象;
AuthManager--提供用户认证的相关功能;
IQAuthHandler--接收并处理命名空间为“jabber:iq:auth”的消息请求,用于处理用户验证业务;
IQRegisterHandler--接收并处理命名空间为 "jabber:iq:register"的消息请求,用于处理用户注册业务;
IQRosterHandler--接收处理命名空间为"jabber:iq:roster"的消息请求,用于处理用户获取花名册业务;--未提供实现,如需此功能需要扩展;
PresenceUpdateHandler--接收处理用户的状态变更请求信息;
Connection--一个XMPP连接服务器的实例,提供发送消息及得到服务器连接相关信息;
ConnectionCloseListener--客户端与服务器之间的连接断开监听器;
StanzaHandler--一个消息处理类,处理传入的XML节,把接收到的消息转换成一个XML的对象;
XmppIoHandler--继承于MINA中的IOHandler,用于从MINA中接收消息,并把消息交给StanzaHandler类处理;
PresenceManager--用于管理用户的在线状态;
NotificationManager--消息通知发送管理类,提供了发送消息给客户端的功能:
A.sendBroadcast--给所有在线用户发送消息;
B.sendNotifcationToUser--给指定用户发送消息 ;
C.sendNotifications--给指定的多个或一个用户发送消息;
D.sendOfflineNotification--发送离线消息;
IQRouter--IQ请求路由类,继承了IQHandler的IQ消息处理类需要在IQRouter类中注册,IQRounter就会跟命名空间把消息路由到相应的处理类中去处理;
MessageRouter--Message消息路由类;
PresenceRouter--Presence消息路由类;
PacketDeliverer--发送到连接的会话;
PacketRouter--Packet路由类,在这个类里有IQRouter、PresenceRouter、MessageRouter三个类的对象,可以对三种类型的消息都可以进行处理路由;
ClientSession--代表一个客户端与服务器之间的连接;从这个连接中可以得到这个连接的相关信息,如用户名,状态等;
SessionManager--管理所有与服务器之间的连接;

服务器端接收客户端消息处理流程:

2.Android端:
NotificationService类--后台运行并响应来自服务器的事件推送通知服务;
ServiceManager类--加载客户端中的配置信息,并管理NotifactionService服务的启动与关闭;
XmppManager类--管理客户端和服务器之间的连接,向服务器发送连接、注册、登陆请求任务;
NotificationDetailsActivity --用于终端接收到的通知详细视图显示;
NotificationIQ--通知实体;
NotificationIQProvider--一个xml的处理类,负责把一个xml结构的消息内容转换成一个NotificationIQ通知实体对象;
NotificationPacketListener---接收从服务器端推送过来的Packet;
NotificationSettingsActivity--设置信息;
NotificationReceiver--推送通知消息的广播接收器;
PersistentConnectionListener--监控客户端与服务器之间的连接关闭和重新连接事件;
PhoneStateChangeListener--监听手机状态;
ConnectivityReceiver--网络变化广播接收器;

PacketReader--从MINA中读取推送过来的信息;
PacketWriter--向MINA中写入回执信息;

接收消息处理流程:

PacketReader
init():
readerThread = new Thread() {
public void run() {
parsePackets(this);
}
};
-》parsePackets
-》processPacket
-》NotificationPacketListener
-》NotificationIQProvider
-》NotificatioIQ
-》Intent
-》发送回执、发出接收到消息的广播
-》点击消息的时候,再次给服务端发送一个查看请求,修改服务器中消息的状态;

如果服务端发送一个message类型的消息到客户端后,客户端是无法处理的。
也就是说客户端可以发送不同类型的消息到服务端,但是却不能处理服务端发回的除IQ认证消息以外的其他类型的消息。
如果需要扩展,需要在NotificationPacketListener类中加入处理逻辑,并提供相应的Provider、消息实体及后续处理逻辑。

热点内容
电脑快速服务器代码怎么查 发布:2025-03-16 03:58:26 浏览:111
电脑虚荣服务器 发布:2025-03-16 03:56:48 浏览:116
android游戏安装 发布:2025-03-16 03:50:08 浏览:330
翻杯子算法 发布:2025-03-16 03:34:31 浏览:603
ftp后台密码怎么设置 发布:2025-03-16 03:33:08 浏览:361
阿里云服务器的sdk是免费的吗 发布:2025-03-16 03:33:04 浏览:8
卸载linux软件 发布:2025-03-16 03:19:07 浏览:809
太平天国迅雷下载ftp 发布:2025-03-16 03:13:19 浏览:65
服务器硬盘温度怎么调节 发布:2025-03-16 03:11:47 浏览:75
netcore编译前执行代码 发布:2025-03-16 03:05:17 浏览:476