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ファイルを圧縮するための)、バイナリストリーム
•新しい契約の作成と既存の契約
 
次に、宝くじクライアントのカラー選択プロトコルを例に挙げて説明します.
メッセージ送信(指定プレイ可能販売期間情報の照会)
メッセージを送信するプロトコルは次のとおりです.
<?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>