BES服务器推送机制分析(一)

作者:  邓明轩

 

前言

 

 

数据推送 Bla ck Be rry 用平 Bla ck Be rry 应用

  Bla c kBe rr y   样通 从服   Bla ck Be rry   设备 端。 开发 Bla c kBe rry 用平 能是 Bla ck Be rry 用集使 大功

然而 原因 一些现使   Bla ck Berr y En t e rpris e S e r ve r ( BE S )   用平

台的推送 能并不能保证数据   Bla c kBe rry   设备,导致应 层面的种种问题。实际 Bla ck Be rr y 从多 成功 了解 BE S MD S   MDS 机制 供的 Bla ck Be rry 备。

本章 分析 MD S ,让 读者 了解 Bla c kB er r y 台, 壮,稳定 Bla ck Be rr y 用。

值得 节的 方文 试总 而来 更多 的线 MD S 送机 RIM 何官 以官 不同版本 Bla ck Be rry 持设 同场 景下 Bla ck Be rry 也要 结合 使用

  Bla ck Be rry 行测 试, 的稳 性。

 

 

 

MDS 推送

 

 

M DS 推送架构

 

 

在详细讲 MD S 之前上了 MD S MD S 送架

 

 


从示 Bla ck Be rry 推送 间顺 为:

1 第一 MD S /BE S 请求 H T TP 式的请 求, 在下

2 第二 MDS / BE S 查询 定应 求是 为合 法的请求 M DS /BE S 服务源情 况确请求 对于 否接 收请 容中 论。

3 第三 MDS / BE S 向应消息 通知 该请 回消 HT TP 答复 返回 器。

4   第四 MDS / BE S 将数 备端

5   第五 据进理后   MDS /BE S 服务 消息

6 第六 MDS / BE S 持设 向应 步消 一步 根据 能不 生。 从这 用服 推送 通道

而成 中有 连接 个连 现异 开发 连接 在应 避。

在详 问题 先了 对于 用开 发人 送需 写工 发出 求的 备端 收推 务器 的程 橙色 的:

 

 

 

 

以下 作详

 

 

数据推送命令 格式

 

 

Bla ck Be rry 台上 的数 器发 据应 逻辑 进行判断 据需 要推 端时 MDS / BE S 进行 送。 应用 MDS / BE S 务器 HTTP 连接 通过 HT TP 送一个 P OS T 求, P OS T 容。

  P OS T   U RL 为:

h t t p:// BE S _ HOS T : BE S _P O R T / pus h?DE S TINA TIO N= D E S INT A TIO N _ADD RE SS &P OR T = HA NDHE L

 


D_APP LIC A TIO N _P ORT &RE Q U E S TU RI=/

下面 明:

参数

描述

 

BE S _H OS T

Bla ck Be rry En t er p ris e S e r v er   者是 IP

 

BE S _P OR T

Bla ck Be rry En t er p ris e S e r v e r 般是 8 08 0

 

DES TINA TIO N_ A DDRE S S

用户 备码   ( P IN)

 

HAN DHEL D_APP LI C A TIO N_ P OR T

Bla ck Be rry   需要 帧听 端口

 

也就是说 器通   BE S _ HOS T   BE S _ P OR T 指定连接   MDS /BE S 服务

需要 BE S   务器 使用 8 08 0   送应 人员 一般 M DS /BE S 务器 IP 了。 如果 BE S 管理 人员 过推 开发使 口。

  U R L     pus h? 后面 部分用 指定 据的接 者和手 设备 要帧听 端口 DES TINA TIO N_ A DDRE S S 于指 使用 者是 持设 P IN HA NDHE LD_APP LIC A TIO N _P OR T 于指 的端 使用 ,要 的程 数据。

除了   U R L 送过使   HTTP 指定 的属

HT TP 下:

HT T P

描述

 

X - RIM-P us h-ID

 

用于 ID I D 以用于 取消 的状

 

X - RIM-P us h-N ot ifyU RL

用于的接 U RL

 

X - RIM-P us h-R eli ab i lit y -Mo d e

用于 性。

 

X - RIM-P us h-D eli v er - Be f o r e

用于 推送 间。

 

X - RIM-P us h-P rio rit y

用于 级。

 

 

X - RIM-P us h-ID   般建使   U R L   合的 方式   1 2 3 @ bl ac kb er r y .c o m 。为

了更 ,一使 作为 ID 使 一的 I D 有利 状态确定 注意 没有 指定 MDS /BE S 服务 会自 动生 ID 样就 使用 ID 数据 了。 ID @ ppg .rim .c o m 束。

X - RIM-P us h-N ot ifyU RL        U RL    h t t p://t e s t ings er v er: 7 7 7 8 指定性后 MDS / BE S 的确 认消 HT TP 请求 服务 发者 HT TP 务器 听指 (上例 t e s t in gs er v er 7 7 7 8 端口 过这 端程 确认 HT TP X -RIM -P us h-ID X -RIM- P us h-S t a t us

X - RIM-P us h-ID 者是 消息,通 X - RIM-P us h-S t a t us 指明 据推 20 0 推送 40 0 推送 失败 据推 成功


不能 20 0 者是 4 0 0 需要 结合判断 本文 章节 会详

属性 X - RIM-P us h-R eli ab i lit y -Mo de T RA NSP OR T 或者是 APP LIC A TIO N 一个 APP LIC A TIO NP REF ER RED 涉及场景 这里 不做描述 果指 性为 TR ANSP O R T 设备 准, 赖。 可靠 APP LI C A TIO N 以数 接收为准 为应 用依 同可设置 续章 体而 用依 送更于广 性质 到数场景 更适 用一 数据 场景

属性 X - RIM-P us h-Deli v er - Bef o r e   推送 最后 间前 据仍 持设 视作 MDS / BE S 务器 弃。

属性 X -RIM -P us h-P rio rit y 于指 ,指 并不 快数推送 的结 持设 选择 no ne ( 缺省 ) lo w   m e di u m   hig h 。如 级为 lo w m e di um   者是   hig h 户只 指定 hig h 户在 到提示对话框

 

 

 

数据推送关键 代码

 

 

理论上讲 器的 数据 可以 HT TP 支持 要实是通 HTTP 协议 P OS T

  ja v a   代码 例讲 数据推 的关键 码部 。本例 代码片 为一   Ja v a App li ca t io n 的部码, Ja v a   App li ca t io n 服务 J 2 S E 行, 线程 HT TP P OS T 求。线程 r un

 

 

public   void   run() {

 

 

Random random = new   Random();

String pushId = "pushID:" + random.nextInt(); String data = "What need to be pushed" ;

 

 

try   {

URL _pushURL = new   URL( "http" , "testingBE S.abc.com" , 8080,

"/push?DESTINATION=user1@abc.com&PORT=55100&REQUESTURI=/" );

 

 

HttpURLConnection conn = (HttpURLConnecti on) _pushURL.openConnection();

conn.setDoInput( true ); conn.setDoOutput( true ); conn.setRequestMethod( "POST" );

conn.setRequestProperty( "X-RIM-PUSH-ID" , pushId);

conn.setRequestProperty( "X-RIM-Push-NotifyURL" ,

"http://testingserver:7778" );

conn.setRequestProperty( "X-RIM-Push-Reliability -Mode" ,

"APPLICATION" );


 

OutputStream   out = conn.getOutputStream();

out.write(data.getBytes());

out.close();

 

 

InputStream ins = conn.getInputStream();

int   contentLength = conn.getContentLength();

int   responseCode = conn.getResponseCode(); System. out .println( "Response Code is:" + responseCode);

if     (contentLength   > 0) {

byte [] someArray = new   byte [contentLengt h]; DataInputStream dins = new   DataInputStream(ins); dins.readFully(someArray);

System. out .println( new   String(someArray));

} else   {

System. out .println( "Content legth of response is 0" );

}

 

 

conn.disconnect();

 

 

} catch   (IOException e) { System. err .println( "Exception:" + e);

}

}

在以 先通 U R L H T TP U RL 数中 第一 为协 类型 这里使 h t t p ,第 个参 为服 器名 第三 参数 的端 号。 第二 对应求中 BE S _H OS T BE S _P OR T U R L 类的 构造 相对 U R L DES TI NA TIO N P O R T 都放在相 U RL 码如

URL _pushURL = new   URL( "http" , "testin gBES.abc.com" , 8080,

"/push?DESTINATION=user1@abc.com&PORT=55100&REQUESTURI=/" );

U R L 例后 可以 o p enCo nn ect io n 接, 返回 一个 Ht t pU RL Co nn ect io n 例。

HttpURLConnection conn = (HttpURLConnecti on) _pushURL.openConnection();

打开   h t t p 连接实例   s et R eq ues tP r o p e rt y 设置   h t t p 送请

  h t t p ,如:

conn.setRequestProperty( "X-RIM-PUSH-ID" , pushId);

其中关键 h t t p 性是 X - RIM-P us h-R eli ab i lit y -Mo de TR AN SP OR T 表示该推送是非应用依赖的推送,设置该属性为 A PP LIC A TIO N ”表示该推 是应用依赖的

                                                                 

APP LIC A TIO N ”:

conn.setRequestProperty( "X-RIM-Push-Reliability -Mode" ,


 

 

"APPLICATION" );

特别 送类 服务 有特 的要 端必 须是 4 .0 须设 置允 使 行应 推送 备的 R OM 也是 4 . 0 上, 手持 支持 服务设置 面如 BE S 理员 进行 置:

 

 

使用 发环   M DS -CS   拟器 用依 的话 需要 MDS /c o n fig 目录 rim pu bl ic .p r o pe rt y pus h. ap pl ic a t io n. r eli ab le.po rt s 一行 同时 ,如 pus h. ap pl ic a t io n. r eli ab le.po rt s =1 0 0 5 5 1 0 0

对于 持设 过手 手持 设备端 浏览 通过   BE S   访问过 络, 务器就会 记录该 持设 是否支持 应用依 的推 测试的话 在测 的浏 站就 果是 虑客 动的访 客户 端都 赖的 送。

如果 话,对 MDS /BE S   送应 拒绝 务器 The s peci fi e d del iv er y m et ho d is no t p oss i bl e ”的用服 务器 序则

java.io.IOException : Server returned H TTP response code: 4 00 for

URL: http://app...

设置   h t t p 连接的   Out putSt re am 需要 写入   Out p ut St re am

中,

需要 MDS / BE S 务器 是通过 h t t p 现的 ,所 送应获取 h t t p 连接 码判 码如

int   responseCode = conn.getResponseCode();

 

 

 

客户端接收关

 

 

客户 Bla ck Be rry 必须 ja v a 需要

Bla ck Be rr y   AP I

客户 是启 线 ,开启 h tt p:// : <po rt> (其中 po r t   是客户 端需 ,然 后从 In putSt r e am ,从 In putSt re am 取服 器所

 


推送

下面 线 run 法, 代码 使 没有修改

                                                   

Bla ck Be rr y 的标

public   void   run(){ StreamConnection stream = null ;

InputStream input = null ; MDSPushInputStream pushInputStream= null ;

 

 

while   (! _stop )

{

try

{

synchronized ( t his )

{

_notify =

(StreamConnectionNotifier)Connector. open ( "http://:55100" );

}

 

 

while   (! _stop )

{

stream = _n o ti fy .acceptAndOpen();

try

{

input = stream.openInputStream();

pushInputStream= new

MDSPushInputStream ((HttpServerConnection)stream, input); DataBuffer d b = new   DataBuffer();

byte [] data = new   byte [256];

int   chunk = 0;

 

 

while   ( - 1 ! = (c hu nk = i np ut .r ea d( da ta )) )

{

db.write (data, 0, chunk);

}

 

 

pushInputStr eam.accept(); input.close( ); stream.close ();

 

 

data = db.ge tArray();

}


 

catch   (I OE xc ep ti on e 1)

{

System. er r .println(e1.toString());

if   ( in pu t != null   )

{

try

{

in pu t. cl os e( );

}

ca tc h   (IOException e2)

{

}

}

if   ( st re a m != null   )

{

try

{

st re am .c lo se () ;

}

ca t ch   (IOException e2)

{

}

}

}

}

_notify .close() ;

_notify = null ;

}

catch   (IOExceptio n ioe)

{

if   ( _notify != null   )

{

try

{

_notify .c lo se () ;

_notify = null ;

}

catch   ( IO Ex ce pt io n e )

{

}

}

}

}

}


 

以上 听的 下:

 

_notify = (StreamConnectionNotifier)Connector. open ( "http:// :55100" ); 其中   U RL h t t p:// : 5 5 1 0 0 是用 5 5 1 0 0  听的 端口 个线 个端侦听 在这 里使 s ync h r o ni z e d 线程 行了

控制。

建立过函 ac cept And Op en 当线 听的 线程 有推 下:

stream = _notify .acceptAndOpen();

侦听 接的 In putSt r e am In putSt re am 推送 的数 读取 In putSt r e am St re am Co nn ect io n ,然 调用 ac c ept A dn Op en 听端 送数

使     In putSt re a m    MDSP us hI np ut St re am 时在 M DSP us hI np ut St re am ac ce pt 知服 务器收到 应用 代码码如下

pushInputStream= new

MDSPushInputStream ((HttpServerConnection)stream, input);

……

pushInputStream.accept();

从良好的编程习惯来 ,在连接使用后需要 动关闭所使用的连接 资源, In putSt re am St re am Co nn e ct io n St re am Co nn ect io nN ot ifi er 例代 码中 到该样例在 常处理阶都对这些资进行了关操作。在关这些连接资源的时 候对 St re am Co nn ect io nN ot ifi er   需要 能在   St re am Co nn ect io nN ot ifi er   中会 读取 ac ceptA dn Op en 的数 ac ce ptA dn Op en 处于 态。

使用依 赖的推送 序调 MDSP us hI np ut St re am ac ce pt 数后 In putSt r e am St r e am Co nn ectio n 闭后 所以 In putSt re am St r e am Co nn ect io n 非常 之重

 

 

 

异步确认消息 收代

 

 

异步 在服 X -RIM -P us h-Not ifyU RL 性所 的服 推送 消息 程序 可以 HTTP 语言是侦 听指 口获 MDS /BE S 发送 HTTP 取相 并返

ja v a 键代 ja v a App li ca t io n 的一部 侦听线程 run

 

 

public   void   run() {

try   {

System. out .println( "Waiting for notifica tion on port" + 77 78


+ "..." );


 

 

while   ( true ) {


 

ServerSocket serverSocket = new   ServerSocket(7778);

serverSocket.setSoTimeout(12000 0);

try   {

Socket clientSocket = serverSocket.accept();

 

 

InputStream input = clientSocket.getInputStream(); StringBuffer str = new   StringBuffer();

int   byteRead = input.read();

while   ((byteRead != - 1) && (i np ut .a va il ab le () > 0) ) {

str.append(( char ) byteRead);

byteRead = input.read();

} System. out .println(str.toString());

OutputStream   output   =   clientSocket.getOut putStream();

 

 

String response = "HTTP/1.0 200 OK" ;

output.write(response.getBytes( ));

 

 

output.flush();

output.close();

 

 

input.close();

clientSocket.close();

} catch   (SocketTimeoutException ste) { System. out .println( "Notification connection timeout.

Restarting..." );

}

serverSocket.close();

}

} catch   (Exception exception) {

exception.printStackTrace();

}

 

 

}

异步 比较 开一个   So ck et   端口 7 7 7 8 断地 从该,打 So ck et 下:

S er v er So ck et s e r ve rSo ck et = new S e r ve rSo ck et ( 7 7 7 8 ) ;

在异 接收 中需 要注   MDS /BE S   服务 ,应 MDS /BE S 一个 2 0 0 MD S /BE S 认消 可能 这样 可能 消息

消息

OutputStream output = clientSocket.getOut putStream();


 

String response = "HTTP/1.0 200 OK" ; output.write(response.getBytes()); output.flush();

output.close();

 

 

 

 

BlackBerry SDK下载

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值