客户端、服务器端程序搭建
最近公司需要 Android 的消息推送,在网上找了很多消息推送的例子,都是无法运行.
经过一段时间的研究,终于把例子运行起来了。现在共享出来,共同学习。
在 androidpn 的官网下载(http://sourceforge.net/projects/androidpn/files/),也可以下载我已经调好的程序。
现在把源码共享给大家,http://download.csdn.net/detail/johnny901114/4410546
在下载的文件里面在 bin 目录下有 run.bat 文件直接双击即可运行。然后在浏览器里面输入 http://127.0.0.1:7070 即可
如果在 eclipse 中运行了客户端即可在服务器端看到,这个很简单,不是本文的重点。
现在主要的就是把下载后的的服务器端源码搭建起来,然后部署到 myeclipse 中运行
需要注意的是我的这个源码使用数据库是 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 文件中配置,在该文件的加上如下配置:
<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 来实现自己的服务器,可以研究下 apache 的项目 mina 该项目就是封装 Java NIO 的。
4) 当可以使用 XMPP 协议来实现推送的. 自己也曾写过简单的一对一即时聊天软件.
5)也可以通过 MQTT 协议来实现推送 .
客户端下载地址 : https://github.com/tokudu/AndroidPushNotificationsDemo
服务器下载地址 : https://github.com/tokudu/PhpMQTTClient
更多关于MQTT的讲解:Android 消息推送(二)基于 MQTT 协议实现的推送功能