- 浏览: 7330464 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (1546)
- 企业中间件 (236)
- 企业应用面临的问题 (236)
- 小布Oracle学习笔记汇总 (36)
- Spring 开发应用 (54)
- IBatis开发应用 (16)
- Oracle基础学习 (23)
- struts2.0 (41)
- JVM&ClassLoader&GC (16)
- JQuery的开发应用 (17)
- WebService的开发应用 (21)
- Java&Socket (44)
- 开源组件的应用 (254)
- 常用Javascript的开发应用 (28)
- J2EE开发技术指南 (163)
- EJB3开发应用 (11)
- GIS&Mobile&MAP (36)
- SWT-GEF-RCP (52)
- 算法&数据结构 (6)
- Apache开源组件研究 (62)
- Hibernate 学习应用 (57)
- java并发编程 (59)
- MySQL&Mongodb&MS/SQL (15)
- Oracle数据库实验室 (55)
- 搜索引擎的开发应用 (34)
- 软件工程师笔试经典 (14)
- 其他杂项 (10)
- AndroidPn& MQTT&C2DM&推技术 (29)
- ActiveMQ学习和研究 (38)
- Google技术应用开发和API分析 (11)
- flex的学习总结 (59)
- 项目中一点总结 (20)
- java疑惑 java面向对象编程 (28)
- Android 开发学习 (133)
- linux和UNIX的总结 (37)
- Titanium学习总结 (20)
- JQueryMobile学习总结 (34)
- Phonegap学习总结 (32)
- HTML5学习总结 (41)
- JeeCMS研究和理解分析 (9)
最新评论
-
lgh1992314:
[u][i][b][flash=200,200][url][i ...
看看mybatis 源代码 -
尼古拉斯.fwp:
图片根本就不出来好吧。。。。。。
Android文件图片上传的详细讲解(一)HTTP multipart/form-data 上传报文格式实现手机端上传 -
ln94223:
第一个应该用排它网关吧 怎么是并行网关, 并行网关是所有exe ...
工作流Activiti的学习总结(八)Activiti自动执行的应用 -
ZY199266:
获取不到任何消息信息,请问这是什么原因呢?
ActiveMQ 通过JMX监控Connection,Queue,Topic的信息 -
xiaoyao霄:
DestinationSourceMonitor 报错 应该导 ...
ActiveMQ 通过JMX监控Connection,Queue,Topic的信息
androidpn的学习研究(七)Androidpn-server的添加其他xmpp相关的协议(如查看好友列表等)
曾经有一个同学,在网上问我,如果想androidpn添加额外的xmpp协议的方法在怎么加呢?我当时很迷惑,后来经过一翻仔细研究androidpn发现,其实每一种处理xmpp协议方法,必须有一个Handler实现。具体可以参考org.androidpn.server.xmpp.handler中。
针对每一个Handler对应的xml拥有不同的命名空间,每一个命名空间在xmpp中都有定义,因为传输的xml的格式是一定的。
例如:
IQAuthHandler:命名空间 String NAMESPACE = "jabber:iq:auth";
IQRegisterHandler:命名空间 String NAMESPACE = "jabber:iq:register";
IQRosterHandler:命名空间 String NAMESPACE = "jabber:iq:roster";
同时我们从Handler的实现可以看到每一个handler最好实现对应IQHandler类,但是为辅助类型的Handler那么可以不用,例如androidpn的状态更新处理器类PresenceUpdateHandler,不必要发送相关的消息到客户端。
所以如果要实现xmpp中如查看好友,用户分组等通信协议,那么你可能要实现相关的Handler并使用xmpp协议规定的相关的命名空间。
在androidpn中主要的业务处理类XmppIoHandler可以看出最终消息解析之后分发到IQRouter中。IQRouter用于处理消息的响应的消息。
IQRouter的源代码如下:
package org.androidpn.server.xmpp.router; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import org.androidpn.server.xmpp.handler.IQAuthHandler; import org.androidpn.server.xmpp.handler.IQHandler; import org.androidpn.server.xmpp.handler.IQRegisterHandler; import org.androidpn.server.xmpp.handler.IQRosterHandler; import org.androidpn.server.xmpp.session.ClientSession; import org.androidpn.server.xmpp.session.Session; import org.androidpn.server.xmpp.session.SessionManager; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.dom4j.Element; import org.xmpp.packet.IQ; import org.xmpp.packet.JID; import org.xmpp.packet.PacketError; /** * This class is to route IQ packets to their corresponding handler. * * @author Sehwan Noh (devnoh@gmail.com) */ public class IQRouter { private final Log log = LogFactory.getLog(getClass()); private SessionManager sessionManager; private List<IQHandler> iqHandlers = new ArrayList<IQHandler>(); private Map<String, IQHandler> namespace2Handlers = new ConcurrentHashMap<String, IQHandler>(); /** * Constucts a packet router registering new IQ handlers. */ public IQRouter() { sessionManager = SessionManager.getInstance(); iqHandlers.add(new IQAuthHandler()); iqHandlers.add(new IQRegisterHandler()); iqHandlers.add(new IQRosterHandler()); } /** * Routes the IQ packet based on its namespace. * * @param packet the packet to route */ public void route(IQ packet) { if (packet == null) { throw new NullPointerException(); } JID sender = packet.getFrom(); ClientSession session = sessionManager.getSession(sender); if (session == null || session.getStatus() == Session.STATUS_AUTHENTICATED || ("jabber:iq:auth".equals(packet.getChildElement() .getNamespaceURI()) || "jabber:iq:register".equals(packet.getChildElement() .getNamespaceURI()) || "urn:ietf:params:xml:ns:xmpp-bind" .equals(packet.getChildElement().getNamespaceURI()))) { handle(packet); } else { IQ reply = IQ.createResultIQ(packet); reply.setChildElement(packet.getChildElement().createCopy()); reply.setError(PacketError.Condition.not_authorized); session.process(reply); } } private void handle(IQ packet) { try { Element childElement = packet.getChildElement(); String namespace = null; if (childElement != null) { namespace = childElement.getNamespaceURI(); } if (namespace == null) { if (packet.getType() != IQ.Type.result && packet.getType() != IQ.Type.error) { log.warn("Unknown packet " + packet); } } else { IQHandler handler = getHandler(namespace); if (handler == null) { sendErrorPacket(packet, PacketError.Condition.service_unavailable); } else { handler.process(packet); } } } catch (Exception e) { log.error("Could not route packet", e); Session session = sessionManager.getSession(packet.getFrom()); if (session != null) { IQ reply = IQ.createResultIQ(packet); reply.setError(PacketError.Condition.internal_server_error); session.process(reply); } } } /** * Senda the error packet to the original sender */ private void sendErrorPacket(IQ originalPacket, PacketError.Condition condition) { if (IQ.Type.error == originalPacket.getType()) { log.error("Cannot reply an IQ error to another IQ error: " + originalPacket); return; } IQ reply = IQ.createResultIQ(originalPacket); reply.setChildElement(originalPacket.getChildElement().createCopy()); reply.setError(condition); try { PacketDeliverer.deliver(reply); } catch (Exception e) { // Ignore } } /** * Adds a new IQHandler to the list of registered handler. * * @param handler the IQHandler */ public void addHandler(IQHandler handler) { if (iqHandlers.contains(handler)) { throw new IllegalArgumentException( "IQHandler already provided by the server"); } namespace2Handlers.put(handler.getNamespace(), handler); } /** * Removes an IQHandler from the list of registered handler. * * @param handler the IQHandler */ public void removeHandler(IQHandler handler) { if (iqHandlers.contains(handler)) { throw new IllegalArgumentException( "Cannot remove an IQHandler provided by the server"); } namespace2Handlers.remove(handler.getNamespace()); } /** * Returns an IQHandler with the given namespace. */ private IQHandler getHandler(String namespace) { IQHandler handler = namespace2Handlers.get(namespace); if (handler == null) { for (IQHandler handlerCandidate : iqHandlers) { if (namespace.equalsIgnoreCase(handlerCandidate.getNamespace())) { handler = handlerCandidate; namespace2Handlers.put(namespace, handler); break; } } } return handler; } }
由以上的源代码可以看出,IQRouter在加载时候将各种处理器添加到回话管理器中,当消息分发到IQRouter中时候,根据命名空间的不同使用不同的处理处置即可。
评论
androidpn客户端也使用命名空间的发送给服务,开源的androidpn-client中之封装部分,如果想增加相关的功能可能就需要自己扩展咯
发表评论
-
[转]年度最实用50款免费Android应用推荐
2012-11-08 16:39 3366据国外媒体报道,有人说Android应用市场比iPhone应用 ... -
MQTT的学习研究(十七)Mosquitto简要教程(安装&使用)
2012-10-23 16:34 19806Mosquitto是一个实现了MQTT3.1协议的代理服务器, ... -
MQTT的学习研究(十六) MQTT的Mosquitto的window安装部署
2012-10-23 16:28 38875在mqtt的官方网站,有许多mqtt, 其中: Mos ... -
GIS的学习(四十五)【转】Integration of the MBTiles format on Android
2012-10-22 17:13 2935转载自 http:/ ... -
MQTT的学习研究(十五) MQTT 和android整合文章
2012-10-22 17:06 5228详细参考: How to Implement Pu ... -
MQTT的学习研究(十四) MQTT moquette 的 Callback API 消息发布订阅的实现
2012-10-19 14:08 11928在moquette-mqtt中提供了回调callback ... -
MQTT的学习研究(十三) IBM MQTTV3 简单发布订阅实例
2012-10-19 13:51 12822使用IBM MQTTv3实现相关的发布订阅功能 MQTTv3 ... -
MQTT的学习研究(十二) MQTT moquette 的 Future API 消息发布订阅的实现
2012-10-19 13:38 7731基于Future 模式的 ... -
MQTT的学习研究(十一) IBM MQTT 简单发布订阅实例
2012-10-19 13:30 6331package com.etrip.push; impo ... -
MQTT的学习研究(十)【转】mosquitto——一个开源的mqtt代理
2012-10-19 13:21 13440MQTT(MQ Teleme ... -
MQTT的学习研究(九)基于HTTP GET MQTT 抓取消息服务端使用
2012-10-18 15:25 5090官方参看文档: HTTP GET 接收主题请求协议和响应协议 ... -
MQTT的学习研究(八)基于HTTP DELETE MQTT 订阅消息服务端使用
2012-10-18 15:20 4270参看官方文档 HTTP DELETE 订阅主题 ... -
MQTT的学习研究(七)基于HTTP POST MQTT 发布消息服务端使用
2012-10-18 15:11 7803参阅官方文档 http:// ... -
MQTT的学习研究(六) MQTT moquette 的 Blocking API 订阅消息客户端使用
2012-10-17 16:56 21920参阅官方文档: http://publib.boulder. ... -
MQTT的学习研究(五) MQTT moquette 的 Blocking API 发布消息服务端使用
2012-10-17 16:52 30734参看官方文档: http://publib.bould ... -
MQTT的学习研究(四)moquette-mqtt 的使用之mqtt Blocking API客户端订阅并接收主题信息
2012-10-16 15:51 14628在上面两篇关于mqtt的broker的启动和mqtt的服 ... -
MQTT的学习研究(三)moquette-mqtt 的使用之mqtt服务发布主题信息
2012-10-16 15:48 19845接着上一篇的moquette-mqtt 的使用之 ... -
MQTT的学习研究(二)moquette-mqtt 的使用之mqtt broker的启动
2012-10-16 15:42 36835在MQTT 官网 (http://mqtt.o ... -
MQTT的学习研究(一)MQTT学习网站
2012-10-16 15:21 11264MQTT的官方推荐网站: http://mqtt.org/s ... -
GIS的学习(四十四)osmdroid sdcard检查
2012-10-15 16:12 2330在许多应用中使用到sdcard的检查,在osmdro ...
相关推荐
首先, 我们需要下载androidpn-client-0.5.0.zip和androidpn-server-0.5.0-bin.zip。 下载地址:http://sourceforge.net/projects/Androidpn/ 解压两个包,Eclipse导入client,配置好目标平台,打开raw/...
使用Apndroid Push Notification 实现android信息推送,AndroidPn项目是使用XMPP协议实现信息推送的一个开源项目。内涵服务端和客户端源码
1. androidpn-server-0.5.0-bin.zip:这个文件包含了一个预编译的AndroidPN服务器。AndroidPN服务器是基于XMPP协议构建的,用于向Android设备发送推送通知。服务器接收来自应用的请求,然后将消息推送到注册的...
基于XMPP协议、使用Androidpn服务器,Asmack编程的即时通讯IM客户端源代码;主要功能实现向客户端推送消息!
另一方面,"androidpn-server-tomcat.zip"则包含了AndroidPN服务端的部署包,这部分是基于Tomcat服务器运行的。Tomcat是Apache软件基金会的Jakarta项目下的一个开源产品,它实现了Java Servlet和JavaServer Pages...
androidpn客户端需要用到一个基于java的开源XMPP协议包asmack,这个包同样也是基于openfire下的另外一个开源项目smack,不过我们不需要自己编译,可以直接把androidpn客户端里面的asmack.jar拿过来用。客户端利用...
这通常通过XMPP(Extensible Messaging and Presence Protocol)协议实现,因为XMPP支持双向通信,适合推送服务。 2. **注册过程**:应用首次安装时,客户端会向AndroidPN服务器注册,获取一个唯一的设备标识符,如...
androidpn xmpp 消息推送 供研究学习使用 项目相关的jar包 androidpn-client-0.5.0,androidpn-server-0.5.0-binmandroidpn-server-0.5.0-src
4. **配置XML文件**:AndroidPN-server可能需要一些特定的XML配置文件,例如`server.xml`、`context.xml`等,以定义连接池、数据源和其他服务器设置。根据需求,编辑这些文件以适应你的环境。 5. **数据库连接**:...
androidpn-client.zip和androidpn-server-0.5.0-bin.zip, 解压两个包,Eclipse导入client,配置好目标平台,打开raw/androidpn.properties文件, apiKey=1234567890 xmppHost=10.0.2.2 xmppPort=5222 如果是...
【标题】中的“安卓XMPP聊天通讯Socket相关-XMPP(Android客户端的实现Tomcat版的Androidpn).rar”提到了XMPP(Extensible Messaging and Presence Protocol)在Android平台上的实现,以及它与Tomcat服务器的结合。...
XMPP(Extensible Messaging and Presence Protocol)是一种开放的即时通讯协议,主要用于实现用户之间的实时通信。在Android平台上实现XMPP客户端,可以构建出强大的聊天应用,例如即时消息、群聊、状态更新等功能...
3. **XMPP协议解析(org.androidpn.server.xmpp.codec)**:负责消息的编码和解码工作。 4. **消息处理(org.androidpn.server.xmpp.handler)**:根据消息类型进行相应的处理操作。 5. **连接维护(org.androidpn.server...
例如,`androidpn-server-0.5.0`可能是一个专为Android平台设计的XMPP服务器实现,负责接收客户端发送的消息,并将它们分发到正确的目标客户端。 客户端则是用户与XMPP系统的接口,它们负责建立与服务器的连接,...
AndroidPN(Android Push Notification)是一种基于XMPP(Extensible Messaging and Presence Protocol)协议的消息推送服务,主要用于Android设备。本文档详细介绍了AndroidPN的通信机制、客户端功能和服务器结构。...
在这个项目中,`asmack`库被用于处理XMPP协议,这是一种广泛用于即时通讯(IM)和推送通知的开放标准。 `asmack`是一个针对Android平台优化的Smack库的分支,Smack是Java中用于处理XMPP的开源库。由于Android系统对...
1. 数据传输基于广泛使用的XMPP协议,与其他如QQ、MSN、GTalk等即时通讯服务兼容。 2. 提供了良好的框架支持,简化了开发者实现推送通知的复杂度。 3. 利用MINA框架有效处理高并发连接,提高了系统效率。 4. 采用TLS...
- org.androidpn.server.xmpp.codec:负责XMPP协议的XML文件解析,服务器通过此包进行消息的编码和解码。 - org.androidpn.server.xmpp.handler:负责处理不同类型的消息。 ***:负责维护与客户端之间的持久连接,并...