XMPP推送

android 专栏收录该内容
32 篇文章 0 订阅

前言:

最近公司需要android的消息推送,在网上找了很多消息推送的例子,都是无法运行.

经过一段时间的研究,终于把例子运行起来了.现在共享出来,共同学习.
在下载的文件里面在bin目录下有run.bat文件直接双击即可运行.然后在浏览器里面输入
http://127.0.0.1:7070即可,如果在eclipse中运行了客户端即可在服务器端看到.这个很简单,不是本文的重点.现在主要的就是把下载后的的服务器端源码
搭建起来,然后部署到myeclipse中运行,当然可以在androidpn的官网下载(http://sourceforge.net/projects/androidpn/files/),
也可以下载我已经调好的程序.现在把源码共享给大家,http://download.csdn.net/detail/johnny901114/4410546
需要注意的是我的这个源码使用数据库是mysql,所以读者的pc机上需要安装mysql数据库,关于数据这里就不多说了.当然最好能够懂点spring和hibernate,这样的话改的时候更加顺手.

但是可能还有不懂hibernate的人,为了能够让他很好的运行,这里就简单的说一下了.


过程:

首先打开jdbc.properties:


# JDBC Configuration
jdbcDriverClassName=com.mysql.jdbc.Driver
jdbcUrl=jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
jdbcUsername=root
jdbcPassword=
# DBCP Pool settings
jdbcInitialSize=5
jdbcMaxActive=10
jdbcMaxIdle=5
jdbcMaxWait=30000
jdbcValidationQuery=select 1



------------------------------------------------------------

jdbcDriverClassName:表示数据库驱动的类名
jdbcUrl:表示连接数据库的url,其中test是数据库的名称
hibernate.dialect: 数据库方言
jdbcUsername和jdbcPassword:mysql的用户名和密码

其他的就不多说了.

如果没有以外的话,服务器启动成功后,可以在浏览器里输入:http://localhost:8080/

就可以出现如下界面:


然后,运行客户端代码,需要注意的是把androidpn.properties中的xmppHost改为你的局域网ip地址.运行如下图所示:


然后在浏览器中的Users界面可以看到手机与服务器之间的连接.如:



然后在Notifications界面可以发送消息给客户端:


在客户端就收到了通知:


其中通知里面的内容就是网页中message输入的内容.ok按钮就是网页中uri的内容.


最后还有一个问题当我们服务器端重启的时候,客户端就无法在连接到服务器了,除非把android后台的服务

关掉,然后重启才行.在XmmpManager中加上如下红色代码就可:

    private void addTask(Runnable runnable) {
        Log.d(LOGTAG, "addTask(runnable)...");
        taskTracker.increase();
        synchronized (taskList) {
            if (taskList.isEmpty() && !running) {
                running = true;
                futureTask = taskSubmitter.submit(runnable);
                if (futureTask == null) {
                    taskTracker.decrease();
                }
            } else {
            //解决服务器端重启后,客户端不能成功连接androidpn服务器
            runTask();

           
                taskList.add(runnable);
            }
        }
        Log.d(LOGTAG, "addTask(runnable)... done");
    }




----------------------------------------------------------------------------------------------------------------------------------------------------------



后续: 2012-8-10


今天公司终于把Androidpn服务器端部署到服务器端了,终于真正的上线了.

大体步骤如下:

1,把服务器的程序通过myeclipse到处war包,然后访问tomcat首页,把war包上传到tomcat服务器.


点击Tomcat Manager出现如下界面:

在默认的情况下登录不成功,需要在tomcat-user.xml文件中配置,在该文件的加上如下配置:

  1. <role rolename="manager-gui"/>  
  2. <user username="tomcat" password="tomcat" roles="manager-gui"/>  
<role rolename="manager-gui"/>
<user username="tomcat" password="tomcat" roles="manager-gui"/>


然后通过如下界面把war包上传到tomcat上:



注意需要在服务器电脑上有相应数据库(我这个里是mysql),并且有Androidpn对应的数据库(我这里的数据库名为test).并且还要注意数据库的用户名和密码.

2,假设服务器端已经能够访问了,需要把客户端的androidpn.properties文件的xmppHost的值改成你服务器端的主机名称,假设你的服务器端访问地址为:http://push.android.net:8080/ ,那么把xmppHost的值改成push.android.net


3,注意把你的8080端口和5222端口打开(这里是服务器那边的人搞的自己不是很懂).





---------------------------------------------------------------------------------------------------------------------------------------------------------



后续二 :关于Androidpn的一些问题(2012.8.16)


1,如果把客户端的随机生成的UUID代码,改成把设备的id或者mac(device/mac)作为用户名,会出现重复插入的错误.

2,把客户端的数据清除(或者重新安装),那么sharedPre里的数据也会没有,然而服务器端又有我们手机的设备id,然后启动程序又会出现重复插入的问题.


所以解决方案为,在服务器端保存用户的时候,检查数据时候存在该用户.

因为在客户端来说自己有没有注册到服务器端,通过SharedPreferences里面是否存在username和password.


-------------------------------------------------------------------------------------------------------------------------------------------------


后续三 :关于Android推送的其他方式(2013.1.4)


其他的推送方案 : 


1> 如果想要方便成本又低 , 推荐使用极光推送 , 只要集成它的官方SDK即可 . 在国内值比较出名的 , 推送文本是免费的 , 还可以推送媒体(收费) , 官网为http://www.jpush.cn/ 


2> android官网最新提供的 , GCM ,是用来代替的C2DM , 其官网为 http://developer.android.com/google/gcm/index.html


3> 可以通过Java nio来实现自己的服务器, 听同事说它的经理自己通过Java NIO写了一个推送服务器 可以接收30w左右的并发, 自己正在尝试写一个 , 如果有进展 , 一定会共享给大家 . 同时可以研究apache的项目mina 该项目就是封装Java NIO的 . 


4> 当可以使用XMPP协议来实现 推送的. 自己也曾写过简单的一对一即时聊天软件.


5> 也可以通过MQTT协议来实现推送 . 

             客户端下载地址 : https://github.com/tokudu/AndroidPushNotificationsDemo 

             服务器下载地址 : https://github.com/tokudu/PhpMQTTClient




如果还有其他问题,可以留言. 谢谢!

转载请注明出处: http://blog.csdn.net/johnny901114/article/details/7715758




25
1
查看评论
32楼 Adeere 前天 16:56发表 [回复] [引用] [举报]
不得不给个好评,这种精神。。。。。。我要发扬光大。。。
31楼 aaron910923 前天 15:39发表 [回复] [引用] [举报]
楼主,你好.我下载了androidPN,现在服务器能推送消息到手机上了.我想把每个登录服务器的用户生成个id,类似QQ这种。现在理不出思路来。问下接下来怎么做?
30楼 androi_li 2013-04-01 15:11发表 [回复] [引用] [举报]
楼主你好,关于后续二 :Androidpn的一些问题(2012.8.16)能给说说怎么改服务器端吗 谢谢
Re: 余强尼 4天前 21:55发表 [回复] [引用] [举报]
回复androi_li:关于服务器相关的修改,我们公司有对openfire 的修改 , 构建自己的即时通讯服务器 , 这个我 没有参数 , 就是根据openfire 的官网和XMPP官网编写一些插件.
29楼 MuRongQiaoFeng 2013-01-13 18:16发表 [回复] [引用] [举报]
请问DB中有那几张表?
28楼 rise511 2012-12-25 10:31发表 [回复] [引用] [举报]
感谢楼主的经验,现在公司也需要类似的项目!
Re: 余强尼 4天前 21:57发表 [回复] [引用] [举报]
回复rise511:应该的, 我今后将会更新关于使用MQTT进行推送的文章(服务器的架构和客户端的编写), 公司最近使用了该技术最为推送的解决方案.
27楼 eclipse_xu 2012-12-19 11:23发表 [回复] [引用] [举报]
你好,我直接运行下载的androidpn-server-0.5.0\bin里面的run.bat文件后,出错 说是bad version number 不知道是什么原因 我java1.5 tomcat 5.0 是要配置什么还是其他原因?谢谢
26楼 longlong870125 2012-12-13 18:17发表 [回复] [引用] [举报]
你好,我现在用asmack也开发了一个IM相关的聊天工具,但一直纠结的是经常掉线,有什么解决办法呢,谢谢。
25楼 lcyaiym 2012-11-24 21:35发表 [回复] [引用] [举报]
lz,我想问一下,如果服务端发了一条信息,用户当时木有在线,在等用户在线了的时候,能不能收到服务端发送的信息?
Re: 余强尼 2012-11-25 20:10发表 [回复] [引用] [举报]
回复lcyaiym:肯定不会
24楼 lovekiss2012 2012-11-19 14:28发表 [回复] [引用] [举报]
楼主你好,最近在做这方面的东西,关于这个有几个疑问:一,客户端可不可以发送数据到服务端?二,可不可以将服务器部署到iis下面?三:怎样才能将我想发送到的信息传给androidpn服务器,然后下发给客户端?四,客户端之间能不能通信?
楼主啊,跪求解答啊。
23楼 silence_gl 2012-11-01 17:40发表 [回复] [引用] [举报]
请问配置成外网可以访问的需要修改哪些配置文件,我将服务器发布到公网上,手机无法连接到公网的服务器。
Re: 余强尼 2012-11-08 08:45发表 [回复] [引用] [举报]
回复silence_gl:可以叫公司的相关人员帮你。部署到外网也是我公司相关人员做的。
22楼 cady36 2012-10-19 16:06发表 [回复] [引用] [举报]
楼主感谢您的分享。我这里想问个问题,我的数据库是sqlserver.我修改了jdbc里面的参数后
jdbcDriverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver
jdbcUrl=jdbc:sqlserver://192.168.22.11;databaseName=rest;autoReconnect=true
hibernate.dialect=org.hibernate.dialect.SQLServerDialect

插入数据到数据库报错
{WARN } [2012-10-19 16:01:27,827] <org.hibernate.util.JDBCExceptionReporter> : SQL Error: 0, SQLState: null
{ERROR} [2012-10-19 16:01:27,828] <org.hibernate.util.JDBCExceptionReporter> : 已生成用于更新的结果集。
{ERROR} [2012-10-19 16:01:27,930] <org.androidpn.server.xmpp.handler.IQRegisterHandler> : org.springframework.jdbc.UncategorizedSQLException: Hibernate operation: could not insert: [org.androidpn.server.model.User]; uncategorized SQLException for SQL [/* insert org.androidpn.server.model.User */ insert into apn_user (created_date, email, name, password, updated_date, username) values (?, ?, ?, ?, ?, ?)]; SQL state [null]; error code [0]; 已生成用于更新的结果集。; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: 已生成用于更新的结果集。
21楼 shengjie 2012-10-16 13:52发表 [回复] [引用] [举报]
弱弱的问一下,数据库在该功能中有什么作用?可以去掉不?谢谢。
20楼 l594702170 2012-10-16 12:55发表 [回复] [引用] [举报]
用Tomcat发布后是放在ROOT目录里的,清空了原ROOT目录,导致我的tomcat管理页无法登录,在哪里可以设置该工程发布的目录?
19楼 喜欢听风的人 2012-10-10 22:30发表 [回复] [引用] [举报]
你好,楼主,看了源码,不知道该怎么在客户端androidpn-client中增加字段,该在哪了处理呢,现在推送到客户端的有title和message,比如想增加时间time的字段,该怎么做呢?
帮忙一下吧,谢谢了,我的号是 1297234270@qq.com
谢谢了。
18楼 NIAT_wenye 2012-09-28 17:17发表 [回复] [引用] [举报]
楼主,您好!我有个问题要请教一下,在服务器的IQAuthHandler类中
String resource = query.elementText("resource");
String username = query.elementText("username");
String password = query.elementText("password");
// String cityCode = query.elementText("cityCode");
这几个值是怎么设置进去的呢?因为我想增加一个cityCode的值,已经传到服务器了,但不知道怎么设置到query里面,求指点
Re: 余强尼 2012-09-28 17:56发表 [回复] [引用] [举报]
回复NIAT_wenye:最近好忙,现在好久没有弄那个了, 里应该通过XML格式与服务器进行通信的(数据交互). 仔细看源码应该可以看懂的.祝你好运
17楼 majunshao 2012-09-26 15:29发表 [回复] [引用] [举报]
首先感谢无私奉献。其次,我下载了你的项目,其中对于jetty的那个版本不能导入到myeclipse中,请问如何导入呢
Re: 余强尼 2012-09-28 17:54发表 [回复] [引用] [举报]
回复majunshao:希望对你有帮助http://blog.csdn.net/origin100/article/details/7341537
16楼 FYXjsj 2012-09-23 22:10发表 [回复] [引用] [举报]
感谢楼主啦!有一个问题,貌似服务器只能显示1个在线用户,甚至有时都没有在线用户!请问楼主怎么解决?????????
Re: 余强尼 2012-09-24 17:16发表 [回复] [引用] [举报]
回复FYXjsj:我的都可以,从来没有出现过这样的问题.是不是所有用户名始终是一个啊!
Re: FYXjsj 2012-09-25 21:47发表 [回复] [引用] [举报]
回复johnny901114:是啊,user里好几个用户,但是session里有时有有时又没有
Re: 余强尼 2012-09-28 17:50发表 [回复] [引用] [举报]
回复FYXjsj:你是通过什么方式产生用户名的?
15楼 d362639061a 2012-09-23 12:59发表 [回复] [引用] [举报]
hello,hello
现在我遇到一个问题,就是我wifi网络跟gprs网络链接切换的时候,会出现链接不上的问题,是不是有什么需要设置的,比如username或者是socket冲突,占用什么的?不是很了解,希望能指教一下
Re: 余强尼 2012-09-24 15:09发表 [回复] [引用] [举报]
回复d362639061a:那就是断开网络,后不能重复连接了.文章里面不是有解决方法吗?
14楼 sparta128 2012-09-18 17:29发表 [回复] [引用] [举报]
你好,有个问题请教下。
客户端锁屏之后,过一段时间就会掉线,这个是怎么回事啊?
Re: 余强尼 2012-09-19 08:00发表 [回复] [引用] [举报]
回复sparta128:有可能你的后台服务被杀死
13楼 NIAT_wenye 2012-09-18 11:28发表 [回复] [引用] [举报]
为什么一个模拟器会产生两条记录呢?
Re: 余强尼 2012-09-19 08:01发表 [回复] [引用] [举报]
回复NIAT_wenye:因为判断记录是否存在,根据UUID生成的.你可以通过MAC地址或者设备id作为标识.
12楼 yanweimin5 2012-09-17 19:06发表 [回复] [引用] [举报]
可以发我一个war包吗,环境限制没法装me, xiangtan6@qq.com.
3q.
Re: 余强尼 2012-09-18 08:01发表 [回复] [引用] [举报]
回复yanweimin5:war包可通过myeclipse到处即可.最近比较忙.尽情谅解....
11楼 NIAT_wenye 2012-09-17 14:10发表 [回复] [引用] [举报]
您好!我想问下服务器端怎么监控有客户端连接上来呢?
Re: 余强尼 2012-09-19 08:04发表 [回复] [引用] [举报]
回复NIAT_wenye:你登录别人的网站,别人的服务器怎么知道你连接到服务器.?
这是一样 的道理.
这是连接协议决定的.
10楼 chengdou237 2012-09-12 10:04发表 [回复] [引用] [举报]
我的在tomcat下运行,但是启动后,5222端口可以监听,启动模拟器的时候服务器监听不到,发消息没反应,而且好像回话没建立,session都是空,怎么回事呢?properties文件的ip地址 我改成127.0.0.1了
Re: 余强尼 2012-09-28 17:50发表 [回复] [引用] [举报]
回复chengdou237:改成你的局域网ip即可
9楼 mengxd200621 2012-09-11 16:50发表 [回复] [引用] [举报]
写的好牛啊,感谢楼主的奉献
Re: 余强尼 2012-09-28 17:54发表 [回复] [引用] [举报]
回复mengxd200621:谢谢支持
8楼 zhengzheng0301 2012-09-11 13:52发表 [回复] [引用] [举报]
楼主你好 您说的重连只是客户端加上那段红色的代码就可以了吗? 服务器的代码有需要修改的吗?
Re: 余强尼 2012-09-14 09:26发表 [回复] [引用] [举报]
[reply]zhengzheng0301[/reply肯定需要需改的,源码只是一个原始的
7楼 zhiyi2010 2012-09-10 22:31发表 [回复] [引用] [举报]
楼主好人啊。
我也一直在研究这个androidpn服务端,一直想把它融入到自己的项目中,但却不知如何入手,
Re: 余强尼 2012-09-11 08:39发表 [回复] [引用] [举报]
回复zhiyi2010:可以的,如果在本地运行起来了,融入自己的项目不会难的.有问题可以留言.
6楼 [游客] 2012-09-06 13:58发表 [回复] [引用] [举报] [删除]
我通过eclipse在tomcat上运行服务器端,没有问题,但是当我打包成war文件上传到tomcat上,再运行,访问就出错了。
Re: 余强尼 2012-09-07 08:35发表 [回复] [引用] [举报]
[reply][/reply嗯,报了什么错误.你是打包上外网还是在本机测试
5楼 jinwen_li2012 2012-09-03 23:07发表 [回复] [引用] [举报]
除了感谢没得说的,我这几天刚刚接触,以后有问题还可能来问楼主哦。
Re: 余强尼 2012-09-04 08:03发表 [回复] [引用] [举报]
回复jinwen_li2012:好的,没有问题.
4楼 kevengreat 2012-08-16 14:35发表 [回复] [引用] [举报]
LZ好人啊
Re: 余强尼 2012-08-16 16:15发表 [回复] [引用] [举报]
谢谢支持!回复kevengreat:
3楼 snwrking 2012-08-15 17:23发表 [回复] [引用] [举报]
楼主是一淘的?
我现在也有推送的问题,就是长期在后台跑的进程,在Android4.x平台上经常被系统杀掉,从而收不到推送
Re: snwrking 2012-08-15 19:02发表 [回复] [引用] [举报]
广播这个在4.0好像也是有问题的。而用intent-filter就有安全方面的问题,要写强action和签名,但怕别人一抓包又捕获,总之十分纠结回复snwrking:
Re: 余强尼 2012-08-15 18:11发表 [回复] [引用] [举报]
回复snwrking:你也可以通过intent-filter来启动服务,在配置的时候,提高服务的权限.详情请参考http://www.doc88.com/p-375363023797.html,这个我也是找的,谢谢!
Re: 余强尼 2012-08-15 18:03发表 [回复] [引用] [举报]
回复snwrking:你可以在Service停止的时候发一个广播,如果停止则重新启动.
Re: snwrking 2012-08-15 19:03发表 [回复] [引用] [举报]
广播这个在4.0好像也是有问题的。而用intent-filter就有安全方面的问题,要写强action和签名,但怕别人一抓包又捕获,总之十分纠结 回复johnny901114:
Re: 余强尼 2012-08-15 20:51发表 [回复] [引用] [举报]
回复snwrking:哈哈,如果不能通过常规手段的话,就用损招把.
你可以通过两个服务互相守护.这样就不会有问题问题了.
Re: snwrking 2012-08-16 15:24发表 [回复] [引用] [举报]
而且我觉得双服务,用户体验也不好,有些用户有洁癖,不喜欢这么多服务回复johnny901114:
Re: snwrking 2012-08-16 15:24发表 [回复] [引用] [举报]
双报务怎么监听Service的状态呢?回复johnny901114:
Re: 余强尼 2012-08-16 16:13发表 [回复] [引用] [举报]
回复snwrking:如果使用两个服务的话,如果一个服务关闭,把另一个服务启动,然后通过它把刚才被关闭的服务重新启动,自己停止.这样的话,用户可能会卸载这样的程序的呵呵.
2楼 iamzgr 2012-08-13 17:04发表 [回复] [引用] [举报]
楼主很棒,是否做过压力测试?
大侠是否研究过MQTT方案,有何看法
Re: 余强尼 2012-08-13 19:12发表 [回复] [引用] [举报]
Androidpn连接的方式长连接,tomcat服务器也不可能支持那么多的连接数.只适合小型应用
至于MQTT,C2DM等推送方式没有研究过.有空研究下.从中选择好的推送方式.谢谢!
Re: iamzgr 2012-08-14 14:40发表 [回复] [引用] [举报]
回复johnny901114:开始看MQTT,共勉
Re: 余强尼 2012-08-14 18:11发表 [回复] [引用] [举报]
回复iamzgr:你公司的用的推送是什么?用的Androidpn遇到什么问题?
Re: iamzgr 2012-08-15 17:33发表 [回复] [引用] [举报]
回复johnny901114:现在还没有好的方案,MQTT支持的连接数也不多,继续了解中
Re: 余强尼 2012-08-15 20:51发表 [回复] [引用] [举报]
回复iamzgr:发错了,不是发给你的.不好意思.
Re: 余强尼 2012-08-15 20:50发表 [回复] [引用] [举报]
回复iamzgr:哈哈,如果不能通过常规手段的话,就用损招把.
你可以通过两个服务互相守护.这样就不会有问题问题了.
1楼 dagebo 2012-07-31 21:39发表 [回复] [引用] [举报]
真是雪中送炭啊!感谢楼主奉献
Re: 余强尼 2012-08-01 08:35发表 [回复] [引用] [举报]
能够理解你的心情,一开始公司需要的时候,我也找了好久,
共享只是希望别人不要再花那么长的时间了.
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值