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 
这里写图片描述
这里写图片描述
这里写图片描述

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

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: 452700765@qq.com

上面说了我这个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环境的网站目录下。我们打开浏览器访问 
这里写图片描述

注意一下 放的路径。

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

验证码输入一下。然后点击 登陆 出来个登陆成功 点击确定 进入后台界面  
这里写图片描述

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

这里写图片描述
这里写图片描述

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

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

这里写图片描述

这里写图片描述

然后点击ID为 10001 这条数据的右侧的 绿色的 推送消息 按钮。就会出现一个推送界面。 
下面是几个推送任务成功提示 
这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

以上。就是大概的使用。应为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文件。很简单。 一定要先看完我这篇文章。了解了我的大体思路 然后再去看代码。会明白的很快。

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值