`
yangyang
  • 浏览: 173509 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

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

阅读更多
          最近在维护一个电信的项目中间遇到了一些通信协议的东西。比如协议的实现等等。我总结了一些心得体会和大家分享一下。没有代码,只是一些思路。 通常情况下我们要用代码实现一个协议通常都要将这个协议看个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>

分享到:
评论
2 楼 JAVA_ED 2007-06-11  
好萌的卡卡西啊
1 楼 piper 2007-05-09  
能详细说一下心跳包吗?

相关推荐

    大型分布式网站架构设计与实践.带目录书签.完整版.rar

    分布式系统的设计,是一门复杂的学问,它涉及到通信协议、远程调用,服务治理,系统安全、存储、搜索、监控、稳定性保障、性能优化、数据分析、数据挖掘等各个领域,对任何一个领域的深入挖掘,都能够编写一本篇幅...

    分布式服务框架原理与实践-李林锋著.pdf

    接着分析了服务底层如何有效地进行通信,包括通信框架、序列化/反序列化及协议栈等;然后分析了服务如何做到高可靠性及高安全性等重要特性;最后也阐述了从服务化如何向微服务演进。干货满满!

    Zigbee入门开发

    在一个zigbee网络中,只有协调器(coordinator)设备可以建立网络,在建立网络过程中,所有的实现过程都是通过原语实现的(具体在程序中,如用c语言,就是调用一个一个函数,或者是一个一个任务来实现(不要刻意最求...

    分布式服务框架原理与实践

    接着分析了服务底层如何有效地进行通信,包括通信框架、序列化/反序列化及协议栈等;然后分析了服务如何做到高可靠性及高安全性等重要特性;最后也阐述了从服务化如何向微服务演进。干货满满!

    亮剑.NET深入体验与实战精要2

    10.2 异步Socket通信——实现MSN机器人 390 10.2.1 机器人服务端 390 10.2.2 客户端实现步骤 395 10.3 基于TCP协议的客户端和服务端 398 10.3.1 TcpListener 实现网络服务端 398 10.3.2 TcpClient实现网络客户端 399...

    亮剑.NET深入体验与实战精要3

    10.2 异步Socket通信——实现MSN机器人 390 10.2.1 机器人服务端 390 10.2.2 客户端实现步骤 395 10.3 基于TCP协议的客户端和服务端 398 10.3.1 TcpListener 实现网络服务端 398 10.3.2 TcpClient实现网络客户端 399...

    HTTP分段下载/断点续传/多线程下载

    为了不打乱第三方调用程序的处理逻辑,这里使用了管道通信技术,将内部下载过程做了封装,因此只有当文件全部下载完毕后, 接口方法download才会执行结束; 当然,你也可以使用线程的join方法实现,这里就不给出...

    JAVA上百实例源码以及开源项目源代码

     Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件,一步步的实现过程请下载本实例的Java源码,代码中包括丰富的注释,对学习有帮助。 Java实现的FTP连接与数据浏览程序 1个...

    JAVA上百实例源码以及开源项目

     Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件,一步步的实现过程请下载本实例的Java源码,代码中包括丰富的注释,对学习有帮助。 Java实现的FTP连接与数据浏览程序 1个...

    asp.net知识库

    在ASP.NET 1.1下实现模板化站点的新思路 在ASP.Net中两种利用CSS实现多界面的方法 用于弹出ModalDialog进行数据选择的控件 使用.ashx文件处理IHttpHandler实现发送文本及二进制数据的方法 制作一个简单的多页Tab功能...

    windows高级调试

    这些知识包括两个方面:Windows中一些底层组件的知识,包括调用栈的结构、堆管理器的工作原理、安全管理机制、进程间通信协议等;一些基本的调试知识,包括调试器的工作原理、调试符号的使用、内存转储文件的结构...

    python入门到高级全栈工程师培训 第3期 附课件代码

    04 线程的调用以及join方法 05 setDaemon方法和继承式调用.baiduyun.downloading 05 setDaemon方法和继承式调用 第34章 01 上节知识回顾 02 并发并行与同步异步的概念 03 GIL的概念 04 同步锁 05 递归锁 06 同步...

    疯狂Android讲义源码

     13.1 基于TCP协议的网络通信 477  13.1.1 TCP协议基础 477  13.1.2 使用ServerSocket创建  TCP服务器端 478  13.1.3 使用Socket进行通信 479  13.1.4 加入多线程 483  13.2 使用URL访问网络资源 488  ...

    C++网络爬虫项目

    以上所述仅仅是网络爬虫的一般性原理,具体实现过程中还可以有很多优化的 空间,比如将“网页下载”以多线索(进程或线程)并发的方式实现,甚至将 “DNS解析”也处理为并发的过程,以避免爬虫系统的I/O吞吐率受到...

    net学习笔记及其他代码应用

    9.描述一下C#中索引器的实现过程,是否只能根据数字进行索引? 答:不是。可以用任意类型。 10.求以下表达式的值,写出您想到的一种或几种实现方法: 1-2+3-4+……+m [Page] 答: int Num = this.TextBox1.Text....

    疯狂Android讲义.part1

    13.1 基于TCP协议的网络通信 477 13.1.1 TCP协议基础 477 13.1.2 使用ServerSocket创建TCP 服务器端 478 13.1.3 使用Socket进行通信 479 13.1.4 加入多线程 483 13.2 使用URL访问网络资源 489 13.2.1 使用URL读取...

    Reversing:逆向工程揭密

    逆向工程是指将工程制品(比如汽车、喷气发动机或者软件程序)以揭示其最底层的细节(如其设计和架构)的方式进行解构的过程。这与研究自然现象的科学研究有些类似,区别就在于一般没有人会把科学研究看做逆向工程,...

Global site tag (gtag.js) - Google Analytics