当前位置: 代码迷 >> Android >> 运用Androidpn进行推送(一)
  详细解决方案

运用Androidpn进行推送(一)

热度:72   发布时间:2016-05-01 19:11:49.0
使用Androidpn进行推送(一)

?

? ? ? ?最近在研究Android的推送,这里主要要讲的用XMPP协议进行android的推送。

?????? Androidpn的全称是android push notification。它一个android推送的开源框架,客户端用到的是asmack,是一个XMMP协议的实现。服务器端用了spring?hibernate进行页面展示,主要是用来显示和服务器建立连接的用户,以及消息的推送。如下图:


?????? 官方的代码实现是用的Jetty来代替tomcat实现的,刚拿到官方代码时,一头雾水,费了一天的时间了解了服务器端的整体构建,然后进行重构。首先把羡慕部署在tomcat上,编译会发现出了很多错误,然后进行整改,删除一些和tomcat重复的包,然后删掉jetty等等等等,具体细节就不阐述了。整改成功后,测试可用,今天开始研究androidpn服务器端的源代码,其实本来我不太了解XMPP协议的,经过这几天的学习,大概明白一点了。下面开始讲解下androidpn中的几个关键类。

?????? 首先登场的当然是和客户端简立连接的类了。是在org.androidpn.server.xmpp.net下的Connection类里,如下是它其中的字段:

public class Connection {

    private static final Log log = LogFactory.getLog(Connection.class);    private IoSession ioSession;    private Session session;    private ConnectionCloseListener closeListener;    private int majorVersion = 1;    private int minorVersion = 0;    private String language = null;    private TLSPolicy tlsPolicy = TLSPolicy.optional;    @SuppressWarnings("unchecked")    private static ThreadLocal encoder = new ThreadLocalEncoder();    private boolean closed;

?

?

其中iosesion引用的MINA框架中的一个类,它是MINA中所有session类的顶级接口,它是线程安全的,其中定义了一些客户端的端口 地址等属性信息,主要是用来保存服务器和客户端之间建立连接的一些信息。MINA是一个socket框架,主要是为了多线程管理socket的出现的,有兴趣的朋友可以看一看。

?????? Session是一个抽象类,也是自定义的,主要是描述一些服务器和客户端的信息。Majorversionminorversion指的是主版本和副版本。

?????? Tlspolicy指的是传输协议的策略,是一个枚举类型,分为三种required,optional,disabled.

?

?????? Encoder主要是来定义编码的,这里用的是utf8

?????? 在这个类里,还有一个ClientAuth,也是枚举类型,主要是用来表示客户端是否需要验证。它主要的功能是用来建立连接,定义了一下发送数据到客户端的方法,还有就关闭连接的时候绑定监听器进行处理。

?????? 今天好晚了,明天继续

?

?

?

1 楼 xytdman 2011-11-10  
您好,看了您的一些服务端推送的一些文章,写的非常不错 ,确实对我受益匪浅,在这里表示感谢,还想请教您一个问题,下了一个您提供的tomcat版本的androidpn服务器端,运行起来以后发现只能与本机的客户端通讯,不能与部署到其他电脑上的客户端通信,客户端已经修改过raw目录下androidpn.properties,xmppHost设置了正确的IP,但是非本机的客户端就是连接不上服务器,尝试用jetty版的服务端连接非本机客户端,可以联通,请问为什么?是否还需要修改tomcat的某些配置文件?
2 楼 xytdman 2011-11-11  
上面的问题已经解决,是我客户端AVD的问题,我对client的IP进行更新了,但是AVD中的没有被更新,我还想请教一个问题,我通过什么软件或什么方式能获得服务器端与客户端通信的数据(主要是通信的xmpp内容)?麻烦你给个回复,我现在只能在日志中看到消息体的内容,用IQ根标记的那个内容。
3 楼 Jclick 2011-11-11  
xytdman 写道
上面的问题已经解决,是我客户端AVD的问题,我对client的IP进行更新了,但是AVD中的没有被更新,我还想请教一个问题,我通过什么软件或什么方式能获得服务器端与客户端通信的数据(主要是通信的xmpp内容)?麻烦你给个回复,我现在只能在日志中看到消息体的内容,用IQ根标记的那个内容。


所有的通讯内容都可以在XMLLightweightParser中的read方法中看到(服务器端的openfire.nio包里),而如果只想看消息的内容,都在/Androidpn/src/org/androidpn/server/xmpp/net/XmppIoHandler.java中messageReceived(IoSession session, Object message)里边。可以看看
4 楼 liuweisir 2011-11-23  
Jclick 你好,我下了一个tomcat版的androidpn的源码,部署之后启动报错:
Error creating bean with name 'urlMapping' defined in ServletContext resource [/WEB-INF/dispatcher-servlet.xml] 不知道是不是缺少文件,麻烦你发给我一份服务端源码,谢谢!
5 楼 liuweisir 2011-11-23  
Jclick   你对androidpn这块研究的挺深的,希望你能建个专门研究push的群,把好的经验分享给大家。
6 楼 tengyun_20 2011-11-24  
楼主啊,有个问题,就是我用你的自己改动的版本,在tomcat6.0.13下运行,index无法显示,返回的是404直接就到404.jsp了。我想问下可能是什么问题啊?请问网上下的run.bat启动的那个服务器连接正常,那怎么从jetty的改动到tomcat呢?真心希望楼主有个教程,网上相关也没有……
7 楼 tengyun_20 2011-11-24  
现在index.jsp有变成跳转404的问题莫名其妙的好了。但是,现在的问题,以往通过.do的方式访问仍然不行,抛出一堆异常。点击tab上的home显示异常的页面,点击user、session、Notifications则是400。求解决方式啊……呜
8 楼 wuzhi11love 2011-12-21  
把客户端的xmppHost改为服务器的ip就可以访问服务器了
9 楼 sekone 2011-12-22  
你好,我运行网上下来的androidpn bin目录下的 run.bat 一闪而过 打开 http://127.0.0.1:7070/index.do 无法访问 是什么原因啊?我的jdk 版本:1.6.0_26
10 楼 auqyvpl 2012-02-06  
请问在哪了下载tomcat版本呢
11 楼 yuyoubin 2012-02-15  
你好!由于项目需求要做推送功能,可否麻烦你传一个tomcat版本的 给我学习下 ? QQ:258306700 盼复。 谢谢!
12 楼 mazhi4562qq 2012-02-17  
你好,麻烦问下androidpn能推送信息,那能推送软件吗?
13 楼 cdztop 2012-02-26  
请问一下,怎么启动服务器端的代码呢?

我是把服务器端的代码复制到tomcat的webapps这个目录下,然后启动tomcat。
在IE里输入:http://localhost:8080/Androidpn/WebRoot/index.jsp

结果出现下面的错误:



HTTP Status 500 -
--------------------------------------------
type Exception report
message
description The server encountered an internal error () that prevented it from fulfilling this request.
exception
org.apache.jasper.JasperException: /WebRoot/index.jsp (line: 2, column: 1) File "/includes/taglibs.jsp" not found
org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:42)
org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:408)
org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:133)
org.apache.jasper.compiler.Parser.processIncludeDirective(Parser.java:322)
org.apache.jasper.compiler.Parser.parseIncludeDirective(Parser.java:357)
org.apache.jasper.compiler.Parser.parseDirective(Parser.java:467)
org.apache.jasper.compiler.Parser.parseFileDirectives(Parser.java:1777)
org.apache.jasper.compiler.Parser.parse(Parser.java:135)
org.apache.jasper.compiler.ParserController.doParse(ParserController.java:242)
org.apache.jasper.compiler.ParserController.parseDirectives(ParserController.java:119)
org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:193)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:373)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:353)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:340)
org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:646)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:357)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
14 楼 androidzjb 2012-03-07  
改了一天没改成,能说一下具体删除那些jar包吗?
15 楼 454281995 2012-04-03  
启动服务端  是否只改jdbc.properties 就可以了, 我该了这个老是连不上数据库
16 楼 zsxsilence 2012-06-20  
万分感谢牛人的分享,帮了很大的忙。然后再劳烦牛人帮忙解答一下 openfire和androidpn有啥关系?他们之间的主要区别是啥?还有androidpn能够支持多大的用户量并发?有没有参考性的数据?再次感谢

代码迷推荐解决方案:The server encountered an internal error () that prevented it from fulfilling this request.,http://www.daimami.com/java-web/317.html