锁定老帖子 主题:实现通信协议的思路、架构以及调用过程
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-04-29
最近在维护一个电信的项目中间遇到了一些通信协议的东西。比如协议的实现等等。我总结了一些心得体会和大家分享一下。没有代码,只是一些思路。 通常情况下我们要用代码实现一个协议通常都要将这个协议看个2~3遍,只有对这个协议有了一定了解我们才能够用代码实现它,架构设计才能合理,维护起来才能比较容易。本文主要针对基于tcp/ip通信协议。<o:p></o:p>
首先我们要搞清下面几个问题:<o:p></o:p> 1.这个协议主要完成那些实际功能.例如对手机用户进行管理,或者查询手机用户信息等等<o:p></o:p> 2.支持TCP/IP协议还是UDP协议,如果支持TCP/IP协议,那么它是基于长连接还是短连接. 3.这个协议所定义的数据类型 4.协议包头(HEADER)的定义。 5.协议包体(BODY)的定义。 在说明实现过程之前,我们来了解几个概念: 数据包(PDU) - 通信协议中定义的数据包既通信数据。它主要包括请求和应答(TCP/IP) 包头(HEAD) - 通信协议中定义的数据包的一些重要的信息。如果包的长度,功能命令。 包体 – BODY包含一些为了完成HEADER中定义的功能所需要的一些数据。注意有的时候一个包是可以没有包体的。如:心跳包。 实现过程: 1. 实现协议所定义的基本的数据类型。如:定长字符串、整形的字节数组、协议定义的特殊数据类型。 2. 协议基本的常量,我们可以定义一个类或者接口来将协议中的常量统一的保存起来。但有些业务常量还是跟随业务类或者接口在一起比较好,具体情况具体分析。 3. PDU包装器和PDU解析器,在各种PDU使用。这个是我们实现这个协议的一个关键。 · PDU包装器 :这个类可以将协议的数据类型转换成字节数组,并保存在包装器中。我们用它来将我们包装的PDU中的信息装换成字节数组的形式,因为只有转化成字节数组的形式才能在网络上传输。 · PDU解析器:这个类可以将字节数组(通过socket inputstream读出来的)的信息解析包装成协议中定义的各种类型。这个类的工作过程是和PDU包装器反相的。 PDU包装器和PDU解析器都包含一个字节数组,并有一个可以移动的当前位置标志。数组的作用是保存pdu 字节信息,而位置标志用来记录当前读取位置或者当前转换位置。只有这样才能依次读取或者转换字节数组。 <o:p> </o:p> 4. 实现HEADER,在实现的过程中我们需要协议定义的一些特殊的数据类型,所以我们需要把这个步骤定义在后面。 5. 实现PDU,从面向对象设计的角度出发,我们首先要找出所有完成不同功能的PDU的公共部分(如相同的字段或相同的功能)抽象出来定义成接口、抽象类或者公共的基类(BASE CLASS),具体设计依照协议的具体定义。然后通过实现PDU接口或者继承公共的PDU抽象类或者基类来实现不同的PDU. 它应该有两个重要的方法: 1) Input Method : 将输入字节流(Socket InputStream )包装成当前的PDU对象,用于进一步处理。 2) Output Method 将当前的PDU对象转换成字节流的形式,用于通过(Socket OutputStream )在网络中传输。 6. PDU 管理器,用来读取和创建PDU. <o:p> </o:p> 完成协议中的功能:我们可以通过发用消息包和得到消息包来完成协议功能。 下面介绍完成协议功能的步骤: I. 创建请求对象 II. 根据不同功能设置 header的字段值 III. 保存header到请求对象中 IV. 根据header中设置的PDU的功能,保存功能必须的字段到请求对象中。 V. 发送请求对象字节流 VI. 得到响应对象 VII. 解析响应对象 VIII. 得到结果 上面总结了协议实现的思路、架构以及调用过程,希望能够对大家有所帮助,能够达到抛砖引玉的效果。 <o:p> </o:p> 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-05-09
能详细说一下心跳包吗?
|
|
返回顶楼 | |
发表时间:2007-06-11
好萌的卡卡西啊
|
|
返回顶楼 | |
浏览 4053 次