第四章 系统详细设计
4.2 通讯模块.
4.2.1 功能概述.
本模块需要完成客户端和服务端的信息交换任务, 是衔接销售模块和服务器管理模块的纽带, 也是本系统至关重要的一部分.
(1) 数据交换.
前端销售部分准备好要发送的数据, 提交给该通讯模块, 然后和服务器建立连接, 等待服务器回应, 当获取服务器连接许可后, 封装本地数据以TCP传输的方式发送至服务器, 发送成功后, 接收服务器确认信息, 更新本地信息(日志).销售模块以XML文档的方式缓存数据, 服务器以解析该文档后执行数据库操作.
(2) 分布式查询.
销售模块提交查询请求, 通讯模块, 需封装该查询请求, 获取服务器响应
后, 返回数据给销售模块.
4.2.2 消息格式.
统一使用XML作为数据交换方式. 所有需要传输的数据首先序列化为XML文档(类似SOAP). 格式暂定如下:
<!--标识身份-->
<?xml version="1.0" encoding="utf-8"?>
<Envelope>
<Header>
<!--标识身份-->
<!—密钥-->
</Header>
</Envelope>
<!—通讯内容-->
<?xml version="1.0" encoding="utf-8"?>
<Envelope>
<Message>
<!--消息体: 包含消息长度,密钥-->
<Items>
<!--内容元组-->
<Item>
</Item>
<Item>
</Item>
</Items>
</Message>
</Envelope>
<!—确认通知-->
<?xml version="1.0" encoding="utf-8"?>
<Envelope>
<!—密钥-->
<Back>
<!—确认内容-->
</Back>
</Envelope>
XML由<Header>和<Message>组成, 类似Web Services中的soap头的定义,处理方式也大致相同. 主要用于对发送方进行身份验证, 传递消息格式或类型. 当Header获取服务器验证后, 后面的内容才会被接收. <Message>也就是消息内容了. 服务器接收后进行解析, 执行相关的数据处理, 具体要依情况而定.
4.2.3 数据安全
Internet不提供实体间安全通信的方式, 在网络上传输的数据很容易被未经授权的第三方截获或修改, 为了保证数据安全, 就需要在不安全的信道上创建安全的通信方式, 确保数据的行之有效的一种方法就是对所传输的数据进行”加密--解密” 操作, 具体体现就是, 发送方按照双方约定的加密算法(有多种形式)加密数据, 然后发送给接收方, 接收方再进行解密.
常用以下两种数据加密方法:
(1) 私钥(对称)加密.
具体做法是传输双方使用相同的密钥进行加密和解密, 密钥由任何一方生成, 此种方法缺点是: 密钥需要共享, 即将密钥传输给对方, 当该私钥被第三方截获, 就失去了数据加密的意义.
· NET Framework 提供以下实现私钥加密算法的类:
· DESCryptoServiceProvider
· RC2CryptoServiceProvider
· RijndaelManaged
· TripleDESCryptoServiceProvider
(2) 公钥(非对称)加密.
非对称加密由传输一方生成一对密钥(公钥和私钥), 公钥和私钥满足以下条件:
公钥加密的数据只能由私钥解密, 私钥加密的数据只能由公钥解密.
所以密钥生成方只需要将公钥发送给对方, 用公钥加密数据, 接收后用私钥解密即可. 使用这种加密技术, 即使第三方截获公钥,也无法对数据进行解密. 从而保证了数据通信的安全.
.NET Framework 提供以下实现公钥加密算法的类:
· DSACryptoServiceProvider
· RSACryptoServiceProvider
针对本系统采用 对成加密算法即可, 具体做法如下, 发送方(客户机)对要发送的数据进行加密, 然后连同密钥发送给接收方(服务器), 接收方再使用该密钥进行数据解密.
4.2.4 通信协议设计
该部分定义了通讯双方共同遵守的规则, 协议共由三部分组成.
(1) 身份验证.
发送方首先需要把标志身份的信息<Header> 发送给服务器, 获得服务器确认后才可继续发送数据. 当身份验证失败后, 服务器会给出错误提示, 并拒绝接收消息.
(2) 信息发送.
通过身份验证后, 即可继续发送数据<Message>到服务器, 注意:这些数据必须经过加密处理.
(3) 接收确认.
当接受方(服务器)接收到数据后, 确认数据完整,无误后, 会向发送方(客户机)发出接收确认通知<Back>, 如果失败, 则发送失败通知, 客户机接收到”成功接收通知” 后才能修改本地 “更新日志”, 如果接收到 “接收失败通知” 后会重新发送数据, 转(1).
4.2.5 更新日志.
从日志中读取更新记录, 先做如下假设.
假设上次进行更新数据的日期为I, 当前时间为 J, 则从I 到J-1 的数据记录都要发送给服务器. 发送完成后将更新日志中的 “最后更新日期” 修改为当前日期, 添加新的更新记录.
注意: 执行更新操作当日所生成的缓存数据不可发送.
更新日志格式定义如下.
<!—更新日志-->
<?xml version="1.0" encoding="utf-8"?>
<UpdateLog>
<LastUpdate>
<!—日期-->
</LastUpdate>
<Items>
<!—更新详细记录-->
<Item>
</Item>
</Items>
</UpdateLog>
4.2.6 客户端数据库设计.
客户端数据库使用ACESS, 定义如下表.
(1) 销售表.
缓存销售记录.
(2) 订单表.
(3) 用户表. 保存客户端登陆用户名和口令.
(4) 商品信息表: 同服务器.
(5) 库存表: 同服务器.