Androidネットワーククライアント:プロトコルのカプセル化と抽出
23289 ワード
プロトコルのパッケージと抽出は複雑で、シーケンス化と逆シーケンス化で、自分で少しまとめました.
一.なぜプロトコルのカプセル化を行うのか
従来の処理方式:XmlSerializerを用いてプロトコルシーケンス化コードを少しずつ作成
問題があります(100件のリクエストを処理する必要があるとします):
1.プロトコル中の要求を異なるメンバーに割り当てて処理する必要がある.つまり、ほとんどのメンバーはプロトコルを学ぶ必要がある.
2、学習状況検査は、すべてのメンバーが協定をよく理解しているかどうか(協定シンポジウムを開く).
3、プロトコル開発段階に入ると、類似のコードは100回発生する必要があり、異なる人員が処理するため、過程でエラーが発生しやすく、抽出作業が統一されていない.
4、開発中にプロトコルが修正されたので、すべてのメンバーが手を止めて、それぞれ作成した要求コード(会議の配置)を変更する必要があります.
この場合、開発プロセスが遅くなります.私たちの解決策は、プロトコルをカプセル化し、抽出することです.
二.プロトコルパッケージのいくつかの原則
1.ノードのオブジェクト化
ノードオブジェクト:Leaf、Header
Oelement、Element(リクエストおよび返信)、Body
Message
2.ノードのシーケンス化
•シーケンス化の原則:自己管理
•シーケンス化範囲:要求されたノードのみがシーケンス化に関与
•シーケンス化順:Leaf、Header、Element、Body、Message
•Messageノードによるリクエスト・エントリの提供
•Messageノードの対外xmlファイルデータ提供方法
3.要求インタフェース(抽象)化
Elementインタフェース(抽象)は、すべてのリクエストがインタフェースを実装するか、抽象クラスを継承する必要があり、定義されたリクエストタイプの表示とリクエストのシーケンス化を取得する方法を実装する必要があります.現在の販売期間情報の取得例
4.プロトコルの汎用化
•プロトコルフォーマット:xml、json
•プロトコル圧縮:wbxml(xmlファイルを圧縮するための)、バイナリストリーム
•新しい契約の作成と既存の契約
次に、宝くじクライアントのカラー選択プロトコルを例に挙げて説明します.
メッセージ送信(指定プレイ可能販売期間情報の照会)
メッセージを送信するプロトコルは次のとおりです.
三.パッケージ化を開始する、そのうちの1つのリーフノードのシーケンス化を行う.
四.ヘッダ情報のパッケージング
パッケージされたプロトコルをテストします.
生成されたxmlファイルは次のとおりです.
一.なぜプロトコルのカプセル化を行うのか
従来の処理方式:XmlSerializerを用いてプロトコルシーケンス化コードを少しずつ作成
問題があります(100件のリクエストを処理する必要があるとします):
1.プロトコル中の要求を異なるメンバーに割り当てて処理する必要がある.つまり、ほとんどのメンバーはプロトコルを学ぶ必要がある.
2、学習状況検査は、すべてのメンバーが協定をよく理解しているかどうか(協定シンポジウムを開く).
3、プロトコル開発段階に入ると、類似のコードは100回発生する必要があり、異なる人員が処理するため、過程でエラーが発生しやすく、抽出作業が統一されていない.
4、開発中にプロトコルが修正されたので、すべてのメンバーが手を止めて、それぞれ作成した要求コード(会議の配置)を変更する必要があります.
この場合、開発プロセスが遅くなります.私たちの解決策は、プロトコルをカプセル化し、抽出することです.
二.プロトコルパッケージのいくつかの原則
1.ノードのオブジェクト化
ノードオブジェクト:Leaf、Header
Oelement、Element(リクエストおよび返信)、Body
Message
2.ノードのシーケンス化
•シーケンス化の原則:自己管理
•シーケンス化範囲:要求されたノードのみがシーケンス化に関与
•シーケンス化順:Leaf、Header、Element、Body、Message
•Messageノードによるリクエスト・エントリの提供
•Messageノードの対外xmlファイルデータ提供方法
3.要求インタフェース(抽象)化
Elementインタフェース(抽象)は、すべてのリクエストがインタフェースを実装するか、抽象クラスを継承する必要があり、定義されたリクエストタイプの表示とリクエストのシーケンス化を取得する方法を実装する必要があります.現在の販売期間情報の取得例
4.プロトコルの汎用化
•プロトコルフォーマット:xml、json
•プロトコル圧縮:wbxml(xmlファイルを圧縮するための)、バイナリストリーム
•新しい契約の作成と既存の契約
次に、宝くじクライアントのカラー選択プロトコルを例に挙げて説明します.
メッセージ送信(指定プレイ可能販売期間情報の照会)
メッセージを送信するプロトコルは次のとおりです.
<?xml version=”1.0” encoding=”utf-8”?>
<message version="1.0">
<header>
<agenterid>889931</agenterid>
<source>ivr</source>
<compress>DES</compress>
<messengerid>20091113101533000001</messengerid>
<timestamp>20091113101533</timestamp>
<digest>7ec8582632678032d25866bd4bce114f</digest>
<transactiontype>12002</transactiontype>
<username>13200000000</username>
</header>
<body>
<elements>
<element>
<lotteryid>118</lotteryid>
<issues>1</issues>
</element>
</elements>
</body>
</message>
三.パッケージ化を開始する、そのうちの1つのリーフノードのシーケンス化を行う.
package cn.piaoye.lottery.protocol;
import org.apache.commons.lang3.StringUtils;
import org.xmlpull.v1.XmlSerializer;
/**
*
*
*
* @author piao
*
*/
public class Leaf {
private String tagName;
private String value;
public Leaf(String tagName, String value) {
super();
this.tagName = tagName;
this.value = value;
}
public Leaf(String tagName) {
super();
this.tagName = tagName;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
//<agenterid>889931</agenterid> ,
/**
*
*/
public void serializer(XmlSerializer serializer){
try {
serializer.startTag(null,tagName);
if(StringUtils.isBlank(value)){
value="";// value
}
serializer.text(value);
serializer.endTag(null,tagName);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
四.ヘッダ情報のパッケージング
package cn.piaoye.lottery.protocol;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
import org.apache.commons.codec.digest.DigestUtils;
import org.xmlpull.v1.XmlSerializer;
import cn.piaoye.lottery.ConstantValue;
/**
*
* @author piao
*
*/
public class Header {
//
private Leaf agenterid=new Leaf("agenterid", ConstantValue.AGENTERID);
private Leaf source=new Leaf("source", ConstantValue.SOURCE);
private Leaf compress=new Leaf("compress", ConstantValue.COMPRESS);
private Leaf messengerid=new Leaf("messengerid");
private Leaf timestamp=new Leaf("timestamp");
private Leaf digest=new Leaf("digest");
private Leaf transactiontype=new Leaf("transactiontype");
private Leaf username=new Leaf("username");
/**
* header
*/
public void serializer(XmlSerializer serializer,String body){
//
/**
* messengerid: xml
: :yyyyMMddHHmmss +
:SimpleDateFormat DecimalFormat
*/
SimpleDateFormat dateFormat=new SimpleDateFormat("yyyyMMddHHmmss");
String time=dateFormat.format(new Date());
//
Random random=new Random();
int num=random.nextInt(999999)+1;//1
//
DecimalFormat decimalFormat=new DecimalFormat("000000");
String randomNum = decimalFormat.format(num);
messengerid.setValue(time+randomNum);
timestamp.setValue(time);
//MD5
// + +body 。
String md5Info=time+ConstantValue.AGENTER_PASSWORD+body;
String md5Hex=DigestUtils.md5Hex(md5Info);
digest.setValue(md5Hex);
try {
serializer.startTag(null, "header");
//
agenterid.serializer(serializer);
source.serializer(serializer);
compress.serializer(serializer);
messengerid.serializer(serializer);
timestamp.serializer(serializer);
digest.serializer(serializer);
transactiontype.serializer(serializer);
username.serializer(serializer);
serializer.endTag(null, "header");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// ,
public Leaf getTransactiontype() {
return transactiontype;
}
public Leaf getUsername() {
return username;
}
}
package cn.piaoye.lottery;
public interface ConstantValue {
String AGENTERID="1000002";//
String SOURCE="ivr";//
String COMPRESS="DES";//body
/**
*
*/
String AGENTER_PASSWORD = "9ab62a694d8bf6ced1fab6acd48d02f8";
/**
* des
*/
String DES_PASSWORD = "9b2648fcdfbad80f";
}
パッケージされたプロトコルをテストします.
public void testHeader()
{
XmlSerializer serializer = Xml.newSerializer();
try {
StringWriter writer = new StringWriter();
serializer.setOutput(writer);
serializer.startDocument("utf-8", null);
serializer.startTag(null, "message");
Header header=new Header();
header.serializer(serializer, "");
// body
serializer.startTag(null, "body");
serializer.endTag(null, "body");
serializer.endTag(null, "message");
serializer.endDocument();
Log.i("XmlTest", writer.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
生成されたxmlファイルは次のとおりです.
<?xml version='1.0' encoding='utf-8'?>
<message> <header>
<agenterid> 1000002 </agenterid>
<source>ivr</source>
<compress> DES </compress>
<messengerid> 20121224163229736485 </messengerid>
<timestamp> 20121224163229 </timestamp>
<digest> a6bcb107c326f21006233dd67d9fc038 </digest>
<transactiontype> </transactiontype>
<username> </username>
</header>
<body />
</message>