ddpush原理及过程分析学习转自http://blog.csdn.net/brok1n/article/details/45272573

转载地址:http://blog.csdn.net/brok1n/article/details/45272573

http://blog.csdn.net/languobeibei/article/details/56288947

首先声明一下。我写的这个ddpushWebManager 是我对ddpush的web推送写的一种解决方案。或者说是一种ddpush web推送的解决思路。

再次申明:ddpush 不是我写的。 
ddpush 的官方网站  http://www.ddpush.net/

ddpush 官方 提供了一个java编写的开源的推送服务器。在使用的过程中有需要在网页上管理推送信息的这种需求。我就自己稍微琢磨了一下。就写了一个这个ddpushWebManager 我吧他放到了gitHub上了。 
大家也可以在csdn上下载 
http://download.csdn.net/detail/brok1n/8770677

这个ddpushWebManager的作用就是让我们可以在网页上来管理推送信息、在网页上像ddpush服务器推送消息。然后ddpush服务器再将要推送的消息推送给客户端。

我这篇文章。主要是用来说一下我写的ddpushWebManager的工作流程、以及使用方式。不过我要在这里先简单的说一下ddpush的大致流程。

ddpush: 
首先。ddpush提供了两种连接方式。UDP 和 TCP 官方说明。 UDP比TCP的同时连接数要多很多倍。所以推荐用UDP的方式。 ddpush是用来做推送的。所以说一下。首先ddpush服务器端建立UDP或者TCP服务器。 然后监听服务器的9966端口 UDP 和TCP都是使用这个端口。在这里也顺便说一下。电脑的端口。UDP有的端口、TCP也可有。所以UDP使用9966端口。TCP也可以使用9966端口。TCP的是监听、UDP的是绑定。 没怎么具体看资料。我这说的就是让大家明白。UDP 使用9966端口的同时TCP也可以使用9966端口。 
ddpush服务器监听9966端口之后。客户端用对应的TCP或者UDP连接服务器的这个端口。服务器在收到一个客户端连接的时候。会创建一个客户端的虚拟对象。保存到一个集合里。这个对象里保存了这个对象的uuid(常规来说是md5加密的字符串) 还有这个客户端的网络地址、最后心跳时间、是否有消息需要推送给这个客户端等等一些属性。 
具体可以查看org.ddpush.im.v1.node下的ClientStatMachine.java 这个类。 客户端链接之后。服务器根据这个客户端生成一个ClientStatMachine对象。保存在集合中。 这个集合就是所有连接过服务器的客户端对象集合。这个集合在正常关闭服务器的时候。会被保存到文件中。当ddpush服务器下次启动的时候。就会从文件中读取上次关闭服务器时。保存的客户端对象。

这样 客户端就和服务器端建立了连接、当然这个连接应为各种路由端口映射等问题。需要不时的发送或者接受数据、来告诉路由器这个连接正在使用。避免这个连接被释放。所以ddpush里有心跳机制。 也就是定时 从客户端向服务器端发送消息。如果在一段时间内。服务器没有收到客户端的心跳消息。那么服务器就会认为这个客户端掉线了。 ddpush默认的心跳时间应该是50秒。 大家可以按照自己的需要去修改。

然后我们开始说推送。 ddpush主要是用来从服务器向客户端推送消息。没有从客户端向服务器推送消息。也同时没有客户端向客户端推送消息。 如果有这方面的需要可以自行找解决办法。 当然我这样说。可能有人说 ddpush的客户端也向服务器发送消息。对!是这样的。ddpush的客户端也向服务器发送消息。 
但是: ddpush的客户端向服务器发送的所有消息只有两种类型: 
第一种是心跳消息 
第二种是应答消息

首先第一种消息 心跳消息 这个就不说了。就是为了保持长连接的状态 定时从客户端向服务器发送的消息 
第二种:应答消息 ddpush为了保证客户端接收服务器端推送的消息的到达率 而设计的。 正常情况下 ddpush服务器像客户端推送一个消息。 客户端收到了这条消息 同时将这条消息转发给服务器。服务器接收到了这条转发过来的消息 就知道 这个客户端已经成功的接收到了这条下发的推送消息 然后就把服务器保存的虚拟客户端对象中的 是否有这类消息 设置成 false 如果服务器下发消息之后。没有收到这个客户端反馈的消息。服务器就会在下次接收到客户端心跳的时候 向这个客户端再次发送这条推送消息、直到客户端向服务器发送了响应消息。

好了以上就是ddpush的服务器像客户端推送一条消息的一半的过程。为什么说是一半的。应为我们还没有说 是谁让ddpush服务器向哪个客户端推送消息。下面来介绍一下 怎么告诉ddpush服务器 让ddpush服务器向某个(例如:100001) 用户推送消息

向ddpush服务器发送推送任务的是org.ddpush.im.v1.client.appserver里面的 Pusher.java 这个类。 
里面提供了几种方式 推送0x10消息 推送0x11消息 推送0x20消息 也就是说我们需要用Pusher.java 来告诉ddpush服务器 我要给100001这个用户推送一条 0x10 这种消息 然后ddpush服务器接受到了这个任务。就从 客户端虚拟客户端对象集合中查找这个用户。如果这个用户没有查找到。就根据这条推送消息来创建一个虚拟的用户对象 并存放到虚拟客户端对象集合中 当这个用户登录ddpush服务器之后 ddpush发现服务器已经存在了这个用户。就从虚拟客户端对象集合中把这个用户取出。然后修改这个客户端对象的属性。 同时发现在虚拟客户端对象中有一条需要推送的消息。于是就立即把这条消息推送给这个刚上线的客户端。

这就是怎么告诉ddpush服务器要给谁推送什么样的任务。  
这个向ddpush服务器发布推送任务的过程是 ddpush在启动的时候 同时启动了一个接受推送任务的服务器 这个服务器监听9999端口。 然后 在有要推送的任务的时候。我们创建Pusher.java 这个类的对象。在这个类中。就是连接到ddpush服务器的9999端口。然后 向ddpush发送相对应的数据包。然后ddpush接受到了这个推送任务数据包。检查数据包格式、判断推送任务类型。取出这个推送目标的uuid 从 虚拟客户端对象集合中查找这个uuid 找不到就根据这个推送消息包创建一个 虚拟客户端对象 并将这条推送消息存入这个 虚拟客户端对象中 再把这个对象存到 虚拟客户端对象集合当中。 然后就是上面的过程。 当这个客户端上线的时候。ddpush就发现了有这个客户端对象同时也有一条他的数据。所以这个客户端在上线的时候就会立即收到这条推送消息。

好了基本上ddpush就是这个流程。 同时说一下。ddpush 只能推送最后一条消息给客户端。也就是说ddpush没有推送消息列表 当一条消息被发送到ddpush中 ddpush服务器发送给客户端 如果客户端此时不在线。则肯定是收不到这条推送消息。然后当有第二条消息需要推送给这个用户的时候。 ddpush会抛弃第一个客户端并没有接收到的推送消息。然后开始推送第二条消息。 如果第二条消息客户端也没有收到。并且这时候有第三条或者更多的推送消息需要推送给这个客户端。则ddpush只会保留最后一条推送消息 在这个客户端下次上线的时候 推送给这个客户端。

说了这么多。以上就是ddpush的基本流程。 
让我们知道了。如果想要在网页上推送消息需要有一些条件。 
因为我们知道在网页上做一些操作。如果想发送到其他地方。仅有几种方式。 
第一种 网页中去请求其他的网页。其他动态网站程序 
第二种 网页中将数据保存到文件里。 
第三种 网页中将数据保存到数据库里。 
。。。 其他的我就不说了。

通过上面的了解 我们知道想向ddpush发布推送任务请求。的唯一途径就是使用Pusher.java 或者说唯一途径就是使用TCP 连接到ddpush的9999端口 然后发送推送任务消息包。 我们在网站上 目前就我知道的来讲 在网页上和其他地方建立TCP连接比较麻烦。或者有些无法完成。所以直接在网页上连接ddpush服务器发送推送消息这个首先抛弃。

然后我们来看 将要推送的消息保存在数据库中。 这个和将要推送的消息保存在文件中。这两个都可以 让ddpush知道我要推送什么消息。比如 做一个程序 定时检测数据库或者文件 发现新的推送任务 就取出 然后用TCP连接ddpush将这个要推送的消息发送出去。这样可以实现。但是我也放弃了。应为我感觉这不是一个好的方式。

然后再看看。网页中去请求其他网页。 这个是在网页中比较常见的一种方式。 有了这个目标。我们就来看。如何让我们在网页中请求其他网页 这个被请求的网页知道我们要推送个ddpush服务器消息。并且这个网页可以和ddpush建立TCP连接。 然后我想到了javaweb jsp做法。但是我感觉这样也比较麻烦。应为还得弄tomcat java的网站环境。而且tomcat是给大、多 客户端提送的http服务器。我们这个客户端很少。只有基本上就一个web管理服务器去连接。 所以用tomcat来做。或者用其他的一些HTTP服务器来做就有点 大材小用 而且耗费系统资源。 然后我就想到了自己写一个HTTP服务器。因为这在我看来是比较简单、小巧的方式。在以往的编程、学习 中我知道HTTP内部也就是用的TCP方式。我用java打印过一个HTTP请求的输入流中的所有数据。基本上知道HTTP请求 响应数据包的大概内容。于是我就开始动工。自己写一个简单的HTTP服务器。 当然写这个我没有参考什么书籍 直接就写。 直接就写在我用java写HTTP服务器的时候。结尾遇到一个小问题。就是给客户端响应数据的时候。发现我用浏览器收不到响应数据。 然后我到网上找了一下资料。然后就搞定了。

这是我写ddpushWebManager的最重要的一个东西的大概过程。

好了下面说一下我写的ddpushWebManager 
ddpush原理及过程分析学习转自http://blog.csdn.net/brok1n/article/details/45272573_第1张图片
ddpush原理及过程分析学习转自http://blog.csdn.net/brok1n/article/details/45272573_第2张图片
ddpush原理及过程分析学习转自http://blog.csdn.net/brok1n/article/details/45272573_第3张图片

这是运行的三张截图。我在网页中向我的手机客户端发送了自定义消息。 然后手机收到了自定义消息。

ddpushWebManager这个项目。我提交到github上。在上面我也发了连接。这里再发一次。  
https://github.com/brok1n/ddpushWebManager

然后我们来说一下。我写的这个项目的东西。 
ddpushWebManager 里有两个项目: 
HttpPushServer 这就是一个简单的HTTP服务器。用java写的 
ddpushWebManager 这是推送的网站后台管理用php做的

就这两个东西。 
HttpPushServer 是一个常规的Eclipse项目。下载下来导入即可。 
ddpushWebManager是php项目。放到你的网站里任意位置都可以。 只要能正常访问。 
下载下来学习、测试的话就建立一个本地的PHP开发环境。然后把ddpushWebManager丢到本地的PHP网站目录下就可以了。 

上面说了 ddpush只能接受TCP连接发布的推送任务。所以我这里就在HttpPushServer里写的 我的HTTP服务器接收到了客户端请求。然后简单判断一下请求是否合法。然后就分析要推送什么任务。 然后创建Pusher对象 然后推送。

然后ddpushWebManager就是常规的网站后台。在网站上发布推送消息时。ddpushWebManager会调用HttpPushServer的HTTP接口。向HttpPushServer发送一个推送请求。然后HttpPushServer 接收到。就创建Pusher对象 把这个请求发送给ddpush 
ddpush就和常规的接收到推送请求一样。向目标客户端发送这个推送消息。

我这个项目的大体思路就是这样的。 
我这是写的一个思路。代码组织、结构神马的大家就不要喷了。你可以吧我看做是个小白

ddpushWabManager的php我也是略知一二。不是专业的就找了一下smarty 写写。 
大家在我项目里看到我有写错的地方。欢迎指出。留言或者发Email告诉我。我会及时修正。谢谢。 
我Email: [email protected]

上面说了我这个ddpush的大体流程。也说了我这个项目的大体流程。相信大家都有一个大概的了解了吧。

下面来说说我这个项目的用法。(记得使用前你的从github上下载我这个项目)

首先:你的架设好ddpush服务器。还有客户端。先调试好ddpush和客户端的正常推送消息。 这里ddpush客户端我们给他分配的id是10001 这个数字在客户端会被MD5加密之后就变成uuid 然后把这个uuid传递给ddpush服务器 来标识这个用户 

然后 导入我项目里的 HttpPushServer 这个eclipse项目。修改src下的 httppush.properties 这个配置文件

HTTP_PUSH_PORT=8888 是我们在网页上访问我们的HTTP服务器的端口号。应为考虑到服务器上可能会有其他的网站神马的。所以我们加一个自己定义的HTTP端口。我们在访问的时候我们的HTTP服务器的接口的时候。记得要加上端口号哦。我这里默认写的是 8888 大家看需求 没必要就不用改了。

HTTP_PUSH_SERVER_IP=192.168.1.107 这个就是我们在网页上访问HTTP服务器的ip地址。 常规的网站可以两种方式访问 一种是域名访问 一种就是直接输入IP地址来访问。我们这里直接用IP地址来访问。

DDPUSH_PUSH_SERVER_IP=192.168.1.107 这个是ddpush服务器的IP地址。因为我们要向ddpush发送推送任务

DDPUSH_PUSH_SERVER_PORT=9999 这个就是ddpush的发布推送任务接口的端口号。 对应ddpush中的 PUSH_LISTENER_PORT=9999 这个。 大家再用的时候需要把 httppush.properties 里的 DDPUSH_PUSH_SERVER_PORT的值 修改成和 ddpush 的 ddpush.properties 里的 PUSH_LISTENER_PORT 值一样。

CONNECT_DDPUSHPUSH_SERVER_TIMEOUT=5000 这个事TCP链接超时时间。基本上不用去修改。

然后我们运行 HttpPushServer 的 com.skywds.java/HttpPushServer.java 

然后Console控制台就会提示 HTTP push server starting ….  
这样就表示我们的HTTP服务器启动成功。

然后我们就可以来弄ddpushWebManager了。 
由于这是个php项目。所以我们需要搭建好php环境。我们把ddpushWebManager放到我的本地php环境的网站目录下。我们打开浏览器访问 
ddpush原理及过程分析学习转自http://blog.csdn.net/brok1n/article/details/45272573_第4张图片

注意一下 放的路径。

然后我这里用的是一个后台UI框架。 这个后踢UI框架是开源免费的。  
账号: admin 
密码: admin

验证码输入一下。然后点击 登陆 出来个登陆成功 点击确定 进入后台界面  
ddpush原理及过程分析学习转自http://blog.csdn.net/brok1n/article/details/45272573_第5张图片

然后我们在左侧的 用户中心 用户管理 界面 点击 添加用户按钮 添加一个用户 

ddpush原理及过程分析学习转自http://blog.csdn.net/brok1n/article/details/45272573_第6张图片
ddpush原理及过程分析学习转自http://blog.csdn.net/brok1n/article/details/45272573_第7张图片

这里的属性只有两个是重要的就是ID和UUID 这里的ID 就是对应我们的ddpush客户端的10001 UUID也同样和ddpush客户端的UUID一样。都是 10001的MD5加密后的字符串。 
这界面的其他属性。大家都不用管。我就只是写写。

然后我们来推送消息 打开左侧的 推送管理 推送管理 页面 

ddpush原理及过程分析学习转自http://blog.csdn.net/brok1n/article/details/45272573_第8张图片

ddpush原理及过程分析学习转自http://blog.csdn.net/brok1n/article/details/45272573_第9张图片

然后点击ID为 10001 这条数据的右侧的 绿色的 推送消息 按钮。就会出现一个推送界面。 
下面是几个推送任务成功提示 
ddpush原理及过程分析学习转自http://blog.csdn.net/brok1n/article/details/45272573_第10张图片

ddpush原理及过程分析学习转自http://blog.csdn.net/brok1n/article/details/45272573_第11张图片

ddpush原理及过程分析学习转自http://blog.csdn.net/brok1n/article/details/45272573_第12张图片

ddpush原理及过程分析学习转自http://blog.csdn.net/brok1n/article/details/45272573_第13张图片

以上。就是大概的使用。应为ddpushWebManager 是请求一个http接口然后发送推送消息的。所以有个地方可以修改网页请求的http接口地址。 
在ddpushWebManager中的push.php中 
pusUrl = 'http://192.168.1.105:8888/?act=user&type='.type.’&uuid=’.uuid.'&data='.data.’&ticket=35as1df35a1sdf5a1sdf35’;

这里面的 192.168.1.105 修改成你配置 HttpPushServer 这个HTTP 服务器的ip地址。

我这里电脑ip是192.168.1.105 我吧ddpush配置在了这台电脑上。还有HttpPushServer 也配置在了这个电脑上。所以我修改了HttpPushServer的配置文件将里面的两个ip地址都改成 192.168.1.105 同时将 ddpushWebManager里的 push.php 文件的 
pusUrl = 'http://192.168.1.105:8888/?act=user&type='.type.’&uuid=’.uuid.'&data='.data.’&ticket=35as1df35a1sdf5a1sdf35’;

这里的IP地址也修改成了 192.168.1.105

好了。到现在基本上我这个项目你应该可以正常的运行了。服务器发送消息 网页上发送消息 客户端也能够正常的收到推送消息了。

HttpPushServer的控制台会打印收到的ddpushWebManager提交的推送请求消息。 记得一定要将IP修改正确。 

基本上就是这样了。这个文章似乎有点长了。 大家有需要的就看。

突然发现这个文章写了好几个小时。。。。

来继续 该结尾了。

我这个项目。目的是提供一个思路或者是一个大致上的解决方案。代码写的很随意。大家主要是了解我这个写的思路。然后自己修改。或者自己写一个也行。或者在我这个项目上修改也行。 同时说明一下。我这个ddpushWebManager没有提供用户管理存储数据库的功能。我就是大概的实现这个功能。把所有数据都存到session里去了。大家可以看看ddpushWebManager 的php代码。也就十几个php文件。很简单。 一定要先看完我这篇文章。了解了我的大体思路 然后再去看代码。会明白的很快。

恩恩。基本上就是这些了。这篇超长的文章。到此结束。有任何疑问、意见、建议。欢迎大家回复。

你可能感兴趣的:(android遇到的)