[lottery] 04_协议处理(重要)——发送协议(手机端)

Android 4.0

协议处理

协议分析
发送协议
接收协议
协议封装
节点对象化
节点序列化
请求接口(抽象)化
协议通用化
手机端和服务器端进行通信,需要用协议来约束
①如果是简单的话,就直接在get和post请求中带过去了
②如果是复杂的,需要一个自定义协议文档来说明这个协议是什么(xml否则json)
数字,文本,日期等的格式化,找包java.text,
DecimalFormat,SimpleDateFormat
协议分析:
一、发送协议
举例:查询指定玩法可销售期信息:
①手机端要发送给服务器端的数据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>
②发送协议大概分析

③发送协议详细介绍
header:
第一部分:常量
①agenterid:子代理商id
常量:手机端处理形式
服务器端处理:建立一张表(子代理的信息)
在ConstantValue的接口中设置该id信息

②source:标示xml文件来源
手机:android、iphone
浏览器:IE
source的用途,可用于数据采集,如获取用户手机的IMEI、IMSI、APPLIST——数据采集

③compress:body部分加密的算法(DES)
用户登录

第二部分:用代码组装的信息
①messengerid:xml文件的唯一标示(手机端唯一即可)
格式:20091113101533       000001
      时间戳            +  六位随机数
处理:SimpleDataFormat     DecimalFormat

②timestamp:时间戳,messengerid的第一部分
 
③digest:MD5加密的信息
生成MD5的元数据:时间戳+代理密码+完整的body

第三部分:在协议创建时无法处理
①transactiontype:每一个请求的唯一标示(如用户登录,余额查询,投注)
由服务器端确定,

②username:用户名
body:
elements:看成集合List<Element>
 
    element:封装请求数据(不同的请求,封装的数据不一样)
 
lotteryid:彩种的唯一标示:118
 
issues:获取期次信息(1代表当前销售期)

④实际上用于传递给服务器的xml数据
<!--用于传输的内容-->
<?xml version='1.0' encoding='utf-8' ?>
<message version="1.0">
    <header>
        <messengerid>20120803102102460191</messengerid>   //发送的xml文件唯一标识
        <timestamp>20120803102102</timestamp>   //时间戳
        <username>13200000000</username>  //用户名
        <transactiontype>12002</transactiontype>  //请求操作的类型
        <digest>1b10c6d719c78cdb70c1d357978eff2a</digest>  //body加密后的md5
        <agenterid>1000002</agenterid>  //子代理商id,如果刚开始,只有自己这一家,为了扩展而设置的
        <compress>DES</compress>  //加密body的加密算法
        <source>ivr</source> //请求的来源
    </header> 
    <body>  
        cgYNf1rUkTlcXIFjWR1NnuWWflFq2u/NSQCo9Y6CIoeP/lNAXxRbjHsc1rHY10YiJtdAEy4FJbdw0KqkI8zawTtrMsBViBBPDhLynlepFUd0XFAHNanlsA==
    </body>
</message>
⑤服务器,服务器端接收到请求数据之后如何处理?
信息的核对:
a、查询agenterid信息,代理的大量信息,代理的密码
b、进行DES(可逆)的解密body中的内容
从xml文件中: 
timestamp+代理的密码+完整的body(客户端生成的md5方式)
<body>cgYNf1rUkTlcXIFjWR1NnuWWflFq2u/NSQCo9Y6CIoeP/lNAXxRbjHsc1rHY10YiJtdAEy4FJbdw0KqkI8zawTtrMsBViBBPDhLynlepFUd0XFAHNanlsA==</body>  
timestamp+代理的密码+完整的body生成MD5(服务端的MD5信息)服务端也用该方法来解密
⑥MD5  VS  DES加密区别
1、MD5
时间戳+代理密码+完整body(<body>…</body>)
2、DES加密
body里面不含body标签的内容
二、其他发送协议书写 
其他请求:两点不同之处
①transactiontype内容:不同的请求均不同
②element:不同的请求携带的数据不同

   我们将重点处理五个请求:
   ⑴查询指定玩法可销售期信息(12002)
   ⑵用户注册(10001)
   ⑶用户登陆密码验证(14001)
   ⑷用户余额查询(11007)
   ⑸投注、发起方案 (12006)
 
玩法可销售期信息查询:
lotteryid string * 玩法编号,如果为空,则issues不起作用,并返回所有可以销售的最近的一期信息。
issues int * 需要获取的最大期数max=100期,1表示当前销售期
 
用户注册:(基本信息其他信息需要后续逐步完善)
nickname string 0-15 用户妮称
mail string 0-20 电子邮件
phone string 0-11 联系电话
actpassword string 5-20 账户安全密码
recommentuser string * 推荐用户名
 
用户登陆:
actpassword string 5-20 账户安全密码
 
用户余额查询:
无参数。DES加密内容<elements></elements>
 
投注:(最复杂的)
lotteryid string * 玩法编号
issue string * 期号(当前销售期)
lotterycode string * 投注号码,注与注之间^分割
lotterynumber string  注数
lotteryvalue string  方案金额,以分为单位
appnumbers string  倍数
issuesnumbers string  追期
issueflag int * 是否多期追号 0否,1多期
bonusstop int * 中奖后是否停止:0不停,1停