论坛首页 入门技术论坛

实现通信协议的思路、架构以及调用过程

浏览 4053 次
精华帖 (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>

   发表时间:2007-05-09  
能详细说一下心跳包吗?
0 请登录后投票
   发表时间:2007-06-11  
好萌的卡卡西啊
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics