`
longgangbai
  • 浏览: 7315914 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

androidpn的学习研究(二)androidpn-server服务端启动过程的理解分析

 
阅读更多

      在Androidpn的底层主要采用的mina和openfire两大框架,其中mina主要为底层数据传输的Socket框架。下面简单说明mina的框架。

Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP、UDP/IP协议栈的通信框架(然,也可以提供JAVA 对象的序列化服务、虚拟机管道通信服务等),Mina 可以帮助我们快速开发高性能、高扩展性的网络通信应用,Mina 提供了事件驱动、异步(Mina 的异步IO 默认使用的是JAVA NIO 作为底层支持)操作的编程模型。Mina 主要有1.x 和2.x 两个分支,这里我们讲解最新版本2.0,如果你使用的是Mina 1.x,那么可能会有一些功能并不适用。学习本文档,需要你已掌握JAVA IO、JAVA NIO、JAVASocket、JAVA 线程及并发库(java.util.concurrent.*)的知识。Mina 同时提供了网络通信的Server 端、Client 端的封装,无论是哪端,Mina 在整个网通通信结构中都处于如下的位置:

 

 

 

 

 

     可见Mina 的API 将真正的网络通信与我们的应用程序隔离开来,你只需要关心你要发送、接收的数据以及你的业务逻辑即可。同样的,无论是哪端,Mina 的执行流程如下所示:

 

 

 

 

(1.) IoService:这个接口在一个线程上负责套接字的建立,拥有自己的Selector,监听是否有连接被建立。


(2.) IoProcessor:这个接口在另一个线程上负责检查是否有数据在通道上读写,也就是说它也拥有自己的Selector,这是与我们使用JAVA NIO 编码时的一个不同之处,通常在JAVA NIO 编码中,我们都是使用一个Selector,也就是不区分IoService与IoProcessor 两个功能接口。另外,IoProcessor 负责调用注册在IoService 上的过滤器,并在过滤器链之后调用IoHandler。


(3.) IoFilter:这个接口定义一组拦截器,这些拦截器可以包括日志输出、黑名单过滤、数据的编码(write 方向)与解码(read 方向)等功能,其中数据的encode 与decode是最为重要的、也是你在使用Mina 时最主要关注的地方。


(4.) IoHandler:这个接口负责编写业务逻辑,也就是接收、发送数据的地方。

 

 

 

Mina自带的过滤器(部分)

 

 

     由上面的Mina的执行的过程可以知道针对使用Mina的第三方来说主要的业务主要在IoHandler中。

androidpn-server的spring配置。

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd"> <!-- =============================================================== --> <!-- Resources --> <!-- =============================================================== --> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath:jdbc.properties</value> </list> </property> </bean> <!-- =============================================================== --> <!-- Data Source --> <!-- =============================================================== --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbcDriverClassName}" /> <property name="url" value="${jdbcUrl}" /> <property name="username" value="${jdbcUsername}" /> <property name="password" value="${jdbcPassword}" /> <property name="maxActive" value="${jdbcMaxActive}" /> <property name="maxIdle" value="${jdbcMaxIdle}" /> <property name="maxWait" value="${jdbcMaxWait}" /> <property name="defaultAutoCommit" value="true" /> </bean> <!-- =============================================================== --> <!-- Hibernate --> <!-- =============================================================== --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation" value="classpath:hibernate.cfg.xml" /> </bean> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <!-- =============================================================== --> <!-- Data Access Objects --> <!-- =============================================================== --> <bean id="userDao" class="org.androidpn.server.dao.hibernate.UserDaoHibernate"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <!-- =============================================================== --> <!-- Services --> <!-- =============================================================== --> <bean id="userService" class="org.androidpn.server.service.impl.UserServiceImpl"> <property name="userDao" ref="userDao" /> </bean> <!-- =============================================================== --> <!-- SSL --> <!-- =============================================================== --> <!-- <bean id="tlsContextFactory" class="org.androidpn.server.ssl2.ResourceBasedTLSContextFactory"> <constructor-arg value="classpath:bogus_mina_tls.cert" /> <property name="password" value="boguspw" /> <property name="trustManagerFactory"> <bean class="org.androidpn.server.ssl2.BogusTrustManagerFactory" /> </property> </bean> --> <!-- =============================================================== --> <!-- MINA --> <!-- =============================================================== --> <bean class="org.springframework.beans.factory.config.CustomEditorConfigurer"> <property name="customEditors"> <map> <entry key="java.net.SocketAddress"> <bean class="org.apache.mina.integration.beans.InetSocketAddressEditor" /> </entry> </map> </property> </bean> <bean id="xmppHandler" class="org.androidpn.server.xmpp.net.XmppIoHandler" /> <bean id="filterChainBuilder" class="org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder"> <property name="filters"> <map> <entry key="executor"> <bean class="org.apache.mina.filter.executor.ExecutorFilter" /> </entry> <entry key="codec"> <bean class="org.apache.mina.filter.codec.ProtocolCodecFilter"> <constructor-arg> <bean class="org.androidpn.server.xmpp.codec.XmppCodecFactory" /> </constructor-arg> </bean> </entry> <!-- <entry key="logging"> <bean class="org.apache.mina.filter.logging.LoggingFilter" /> </entry> --> </map> </property> </bean> <bean id="ioAcceptor" class="org.apache.mina.transport.socket.nio.NioSocketAcceptor" init-method="bind" destroy-method="unbind"> <property name="defaultLocalAddress" value=":5222" /> <property name="handler" ref="xmppHandler" /> <property name="filterChainBuilder" ref="filterChainBuilder" /> <property name="reuseAddress" value="true" /> </bean> </beans>



 

 

 

通过Mina的原理我们研究androidpn的运行流程不能看出,如下:

 

 

 

 

androidpn-server执行过程如下:

1.spring初始化并启动过程,调用NioSocketAcceptor。

2。NioSocketAcceptor开始执行调用IoProcessor.

3.IoProcessor开始调用FilterChain。FilterChain调用相关的IoFilter的。其中ProtocolCodecFilter的过滤器调用了org.androidpn.server.xmpp.codec.XmppCodecFactory进行编码。

4.XmppIoHandler实现自IoHanlder并调用通过openfire 的XMLLightweightParser解析相关的业务逻辑。

5.根据解析的信息调用xmpp并处理相关信息。

 

分享到:
评论
2 楼 longgangbai 2012-09-22  
at org.androidpn.server.xmpp.net.XmppIoHandler.messageReceived(XmppIoHandler.java:184)
aixiangct 写道
您好,我最近也在看androidpn的东西,当我整合进入我的项目中时候一直报错,希望得到您的指教,不胜感激

XmppIoHandler的sessionOpened方法无法完成实例化StanzaHandler handler = new StanzaHandler(serverName, connection);其中serverName和connection都有值

具体的错误信息也很奇怪
java.lang.NullPointerException
        at org.androidpn.server.xmpp.net.XmppIoHandler.messageReceived(XmppIoHandler.java:184)
        at org.apache.mina.core.filterchain.DefaultIoFilterChain$TailFilter.messageReceived(DefaultIoFilterChain.java:713)
        at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:434)
        at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1200(DefaultIoFilterChain.java:46)
        at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:793)
        at org.apache.mina.filter.codec.ProtocolCodecFilter$ProtocolDecoderOutputImpl.flush(ProtocolCodecFilter.java:375)
        at org.apache.mina.filter.codec.ProtocolCodecFilter.messageReceived(ProtocolCodecFilter.java:229)
        at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:434)
        at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1200(DefaultIoFilterChain.java:46)
        at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:793)
        at org.apache.mina.core.filterchain.IoFilterEvent.fire(IoFilterEvent.java:71)
        at org.apache.mina.core.session.IoEvent.run(IoEvent.java:63)
        at org.apache.mina.filter.executor.OrderedThreadPoolExecutor$Worker.runTask(OrderedThreadPoolExecutor.java:780)
        at org.apache.mina.filter.executor.OrderedThreadPoolExecutor$Worker.runTasks(OrderedThreadPoolExecutor.java:772)
        at org.apache.mina.filter.executor.OrderedThreadPoolExecutor$Worker.run(OrderedThreadPoolExecutor.java:714)
        at java.lang.Thread.run(Thread.java:662)


明明说XmppIoHandler类 184行的org.androidpn.server.xmpp.net.XmppIoHandler.messageReceived方法报null,你仔细监控这段代码。。
1 楼 aixiangct 2012-09-21  
您好,我最近也在看androidpn的东西,当我整合进入我的项目中时候一直报错,希望得到您的指教,不胜感激

XmppIoHandler的sessionOpened方法无法完成实例化StanzaHandler handler = new StanzaHandler(serverName, connection);其中serverName和connection都有值

具体的错误信息也很奇怪
java.lang.NullPointerException
        at org.androidpn.server.xmpp.net.XmppIoHandler.messageReceived(XmppIoHandler.java:184)
        at org.apache.mina.core.filterchain.DefaultIoFilterChain$TailFilter.messageReceived(DefaultIoFilterChain.java:713)
        at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:434)
        at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1200(DefaultIoFilterChain.java:46)
        at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:793)
        at org.apache.mina.filter.codec.ProtocolCodecFilter$ProtocolDecoderOutputImpl.flush(ProtocolCodecFilter.java:375)
        at org.apache.mina.filter.codec.ProtocolCodecFilter.messageReceived(ProtocolCodecFilter.java:229)
        at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:434)
        at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1200(DefaultIoFilterChain.java:46)
        at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:793)
        at org.apache.mina.core.filterchain.IoFilterEvent.fire(IoFilterEvent.java:71)
        at org.apache.mina.core.session.IoEvent.run(IoEvent.java:63)
        at org.apache.mina.filter.executor.OrderedThreadPoolExecutor$Worker.runTask(OrderedThreadPoolExecutor.java:780)
        at org.apache.mina.filter.executor.OrderedThreadPoolExecutor$Worker.runTasks(OrderedThreadPoolExecutor.java:772)
        at org.apache.mina.filter.executor.OrderedThreadPoolExecutor$Worker.run(OrderedThreadPoolExecutor.java:714)
        at java.lang.Thread.run(Thread.java:662)

相关推荐

    androidpn-client-0.5.0和androidpn-server-0.5.0-bin

    《AndroidPN:构建高效消息推送服务的探索与实践》 AndroidPN(Android Push Notification)是专为Android系统设计的一种远程...对于任何希望提高用户互动性的开发者来说,理解和掌握AndroidPN的使用是至关重要的。

    androidpn-bin-server-0.5.0

    在"androidpn-server-0.5.0"这个压缩包中,包含了服务端的源代码或二进制文件,开发者可以部署并配置这个服务器,以便为自己的Android应用提供推送通知服务。安装和配置过程可能涉及到设置环境变量、配置文件修改...

    androidpn-client-0.5.0 AND androidpn-server-0.5.0

    使用Apndroid Push Notification 实现android信息推送,AndroidPn项目是使用XMPP协议实现信息推送的一个开源项目。内涵服务端和客户端源码

    androidpn-server-1.0.0.zip-jre7

    该程序包修改至开源项目androidpn-server-0.0.5,携带jre7(此为windows版本,如要运行在linix,需更换为linix jre7),无需java配置运行环境,实现离线推送功能,支持推送消息有效期设置,服务端能够自主判断消息...

    androidpn-tomcat-server端

    总之,"androidpn-tomcat-server端"为开发者提供了一个自定义推送服务的基础框架,涉及到了Java Web开发、服务器配置、网络编程等多个领域的知识,对于深入理解移动应用的后台服务有着重要的学习价值。

    androidpn客户端与服务端

    `androidpn-server-0.5.0`包含了服务端的源代码。服务端通常由以下几部分组成: 1. **注册接口**:当一个新的Android设备需要接收推送通知时,它会通过API向服务端注册,提供一个唯一标识(如IMEI)和接收通知的...

    androidpn服务端,客户端.rar

    本资源包提供了AndroidPN服务端和客户端的源码,以及相关的部署说明,便于开发者快速理解和实现推送通知功能。 一、AndroidPN服务端 AndroidPN服务端是基于Java语言开发的,它使用了Spring框架和Hibernate ORM来...

    xmpp-androidPn server and client

    开发者可以深入研究代码,理解其工作原理,或者根据需求进行定制和扩展,比如优化性能、增加新的功能或调整推送策略。 客户端组件: 1. androidpn-client-0.5.0.zip:这个文件包含了AndroidPN的客户端库,用于集成...

    androidpn 服务端和android端源代码

    通过研究这些源代码,开发者可以学习如何实现一个完整的推送通知系统,包括客户端和服务端的交互,网络通信,以及如何在Android系统上有效地处理推送消息。这不仅可以加深对Android平台的理解,也有助于提升服务器端...

    androidpn-tomcat-0.5.0

    另一方面,"androidpn-server-tomcat.zip"则包含了AndroidPN服务端的部署包,这部分是基于Tomcat服务器运行的。Tomcat是Apache软件基金会的Jakarta项目下的一个开源产品,它实现了Java Servlet和JavaServer Pages...

    androidpn 客户端和服务端

    "AndroidPN 客户端和服务端"是一个完整的推送通知服务解决方案,主要针对Android平台。这个项目包括了客户端应用程序和服务器端的实现,旨在提供实时、可靠的信息推送功能,使得应用程序能够在用户不主动打开应用的...

    Androidpn源代码分析

    总之,通过分析Androidpn的源代码,开发者不仅可以学习到消息推送服务的实现,还能掌握Java Web应用的开发和部署,以及Android客户端的后台服务设计。这对于提升Android应用的用户体验,特别是实时通信功能的实现...

    androidpn 消息推送客户端+服务器端

    接下来是服务器端,`androidpn-server-0.5.0`。服务器端负责处理客户端的注册请求,存储设备ID,以及向注册的设备发送消息。其核心功能包括: 1. **用户管理**:服务器需要存储和管理每个注册客户端的信息,包括设备...

    androidpn消息推送-tomcat版

    1. **异常类型定义(org.androidpn.server.xmpp)**:定义了服务器运行过程中可能遇到的各种异常情况。 2. **配置文件加载(org.androidpn.server.util)**:负责加载服务器配置文件,如主机名和端口号。 3. **XMPP协议...

    androidpn服务端

    androidpn服务端源代码,布署在tomcat/webapp下即可,注意修改android_xmpp_server/resources/下的jdbc.properties数据库链接为你自己环境的数据库,第一次启动时,会自动建表的,不用关心。 客户端修正了androidpn...

    androidPN server端源码eclipse tomcat版

    在这个“androidPN server端源码eclipse tomcat版”中,我们主要关注的是如何在Eclipse集成开发环境中配置和运行基于Tomcat服务器的AndroidPN服务。 首先,`androidPN`这个文件夹很可能包含了整个项目源码,包括...

    Androidpn-tomcat

    二、AndroidPN服务端功能 1. **设备注册**:Android设备需要注册到AndroidPN服务器,获取一个唯一的注册ID,用于后续的消息推送。 2. **消息处理**:服务端接收来自客户端的推送消息请求,存储并处理这些消息。 3...

    androidpn消息推送完善版,基于web服务器

    `org.androidpn.server.xmpp.net` 包负责维护客户端和服务端之间的持久连接,并提供了多种消息传输方式。 **6. SSL认证** `org.androidpn.server.xmpp.ssl` 包提供SSL认证功能,确保数据传输的安全性。 **7. 路由...

    Android推送框架 androidpn.doc

    3) `org.androidpn.server.xmpp`包是XMPP服务器的核心,包含入口类`XmppServer`,负责启动和停止服务。 4) `auth`包处理认证,可以在此处集成自定义认证逻辑。 5) `codec`包处理XMPP协议的XML编码和解码。 6) `...

    Android push notification 服务端源代码

    在研究这个"androidpn-server-0.5.0"源代码时,你可以关注上述各个部分,理解代码结构、类关系以及关键函数的实现,这对于自行搭建推送服务或优化现有服务都非常有帮助。同时,通过阅读源代码,你还可以学习到如何...

Global site tag (gtag.js) - Google Analytics