一种基于Java语言的网络通讯数据包解析方法与流程

文档序号:12376817阅读:1276来源:国知局

本发明涉及网络通讯领域,特别涉及一种基于Java语言的网络通讯数据包解析方法。



背景技术:

计算机系统和网络的大量普及使用使全球跨入了信息化时代。但是,正由于现代社会中几乎一切都在“计算机化”,如经济活动(生产、流通、交换、消费等)过程中的管理都已经完成基于计算机系统在运行,而计算机系统的核心是“软件”,也就是说都是基于“软件(程序)”在运行,但从另一角度出发来看软件与软件之间需要交流那么就得通过庞大的“网络”进行交互。“网络”中的语言就像我们平常在生活中一样,提前拟定了一份协议,什么样的词语组合代表着什么样的意思,“网络”中的语言也不例外,在这里我们要提到的就是一种网络语言(网络数通讯据包)解析的方法。从最初传统的一对一关系,随着时间的变化,技术的更新改革,变化为现在的一对多关系,是技术领域上的一大里程碑。这种解析方法的好处在于明确每一份拟定的协议特有的解析方法或函数,如果程序解析模块出错,会很容易定位或者修改错误,与其他协议互不相关,但相对的对于多分协议需要写N份协议的解析方法或者函数,对于后期的维护、与扩展成本也是相当的高。



技术实现要素:

为了克服现有技术的上述缺点与不足,本发明的目的在于一种基于Java语言的网络通讯数据包解析方法,扩展性强,便于新协议的添加,且成本低。

本发明的目的通过以下技术方案实现:

一种基于Java语言的网络通讯数据包解析方法,包括以下步骤:

S1、编写自定义注解;

S2、根据自定义注解定义的内容编写相应的逻辑处理,并封装为“数据转换类”;

S3、根据协议的协议结构,编写协议的数据实体类;

S4、调用“数据转换类”,载入待解析的数据实体,反射获取数据实体类中相应信息,根据该信息调用相应的逻辑处理,输出解析结果。

步骤S1所述编写自定义注解,包括:

S1.1、定义基础数据类型,所述基础数据类型包括枚举和扩展枚举;

S1.2、创建注解类:指定注解所修饰的对象范围,指定注解被保留的时间长短;定义注解的基本字段属性。

步骤S2所述根据自定义注解定义的内容编写相应的逻辑处理,并封装为“数据转换类”,具体包括:

S2.1、创建协议类,在字段上引用自定义注解,赋值自定义注解各字段属性的值;

S2.2、创建数据转换类,编写各基础数据类型互转函数、对象反射函数、对象转字节数组函数、字节数组转对象函数、转换逻辑处理函数,并根据注解编写扩展函数。

步骤S4所述调用“数据转换类”,载入待解析的数据实体,反射获取数据实体类中相应信息,根据该信息调用相应的逻辑处理,输出解析结果,具体包括:

S4.1.1、调用数据转换类对象转字节的函数;

S4.1.2、调用数据转换类对象反射函数,获取协议对象实例的字段属性、自定义注解字段属性、方法函数;

S4.1..3、调用转换逻辑处理函数,根据自定义注解的字段属性调用相应的基础数据类型互转函数与扩展函数;

S4.1.4、调用函数处理完毕后,在有多个协议对象实例的时候合并转换出来的字节数组,返回字节数组;

S4.2.1、调用数据转换类字节数组转对象函数,此时字节数组转对象函数的参数为字节数组、Object数组;

S4.2.2、调用数据转换类对象反射函数,获取协议对象实例的字段属性、自定义注解字段属性、方法函数;

S4.2.3、调用转换逻辑处理函数,根据自定义注解的字段属性调用相应的基础数据类型互转函数与扩展函数;

S4.2.4、调用函数处理完毕后,把转换后的数据赋值协议对象实例的字段属性,反馈结果。

本发明的Java语言的网络通讯数据包解析方法,可以用注解在某个类上面进行标注,这样编译器会在编译文件时,会根据己设定的方法来编译类;本发明还利用Java的反射机制,在运行时中动态获取信息及动态调用对象方法的功能,对任意一个类,都能知道这个类的所有属性和方法,对于任意一个对象,都能够调用任意一个方法和属性。

与现有技术相比,本发明具有以下优点和有益效果:

(1)本发明利用Java的自定义注解与反射机制组合,注解可以无限扩展,根据扩展的注解实现相应的功能,大大提高其扩展性。

(2)本发明注解中定义了相应的枚举与字段,对一系列的扩展都有着相应的约束,大大提高约束性。

(3)本发明注解中可选择需要的注解字段作为组合,大大提高其灵活性。

(4)本发明注解是一部分、协议实体是一部分、协议反射解析是一部分,层次分明提高层次结构的清晰度,提高其阅读性。

(5)本发明通过反射获取注解做出相应的处理,从调用者角度看淡简化复杂性,是需要按部就班的使用即可,降低成本。

附图说明

图1为本发明的网络通讯数据包解析方法的流程图。

具体实施方式

下面结合实施例,对本发明作进一步地详细说明,但本发明的实施方式不限于此。

实施例

如图1所示,本实施例的网络通讯数据包解析方法,包括以下步骤:

步骤1、定义基础数据类型枚举DataType、扩展枚举等。DataType中字段包含dt_UINT8、dt_INT8、dt_UINT16、dt_INT16、dt_UINT32、dt_INT32、dt_UINT64、dt_INT64、dt_FLOAT、dt_DOUBLE、dt_ASCII、dt_BOOLEAN、dt_UINT8_ARRAY、dt_INT8_ARRAY、dt_UINT16_ARRAY、dt_INT16_ARRAY、dt_UINT32_ARRAY、dt_INT32_ARRAY、dt_UINT64_ARRAY、dt_INT64_ARRAY、dt_FLOAT_ARRAY、dt_DOUBLE_ARRAY、dt_NONE;

步骤2、创建注解类DataColumn,Target指定注解所修饰的对象范围@Target(ElementType.FIELD),Retention指定注解被保留的时间长短@Retention(RetentionPolicy.RUNTIME)。定义好注解的基本字段属性,字段属性包括数据类型dataType数据类型枚举默认值为dt_NONE、length数据长度默认值为0(一般字符串ASCII需要指定长度)、order排序序号默认值为0(排列序号如不指定按协议类默认排序)、describe描述默认值为空、enable是否有效默认值为true;

步骤3、创建协议类,根据协议定义协类的基本字段属性。在字段上引用自定义注解,赋值自定义注解各字段属性的值@DataColumn(dataType=DataType.dt_UINT8,describe="描述")等等;

步骤4、创建数据转换类ConvertUtil,编写各基础数据类型互转函数(包含shortToByte()、byteToShort()、charToByte()、byteToChar()、intToByte()、bytesToInt()、longToByte()、byteToLong()、doubleToByte()、StringToByte()、byteToString()、stringToAscii()、asciiToString()、高地位转换函数high2low())、编写对象反射函数(包含反射获取对象属性、函数等函数getreFlection()、反射赋值函数setreFlection())、编写对象转字节数组函数(主入口getBytesByObjects())、编写字节数组转对象函数(包含主入口setObjectsByBytes())、编写转换逻辑处理函数(包含字段排序函数fieldDesc()、字节数组拷贝函数getArrayCopy())、根据注解编写扩展函数等。

步骤5、创建协议对象实例,赋值协议对象实例各字段属性的值;

步骤6.1、调用数据转换类对象转字节的函数getBytesByObjects(),注意对象转字节函数参数为Object数组类型Object[]cl,可加入多个协议对象实例进行转换new Object[]{obj1、obj2、obj3};

步骤6.2、调用数据转换类对象反射函数getreFlection(),获取协议对象实例的字段属性、自定义注解字段属性、方法函数等;

步骤6.3、调用转换转换逻辑处理函数,根据自定义注解的字段属性调用相应的基础数据类型互转函数与扩展函数等;

步骤6.4、调用函数处理完毕后,在有多个协议对象实例的时候合并转换出来的字节数组,返回字节数组;

步骤7.1、调用数据转换类字节数组转对象函数setObjectsByBytes(),注意字节数组转对象函数参数为字节数组、Object数组byte[]data,Object[]cl,因为在Java中有引用对象的说法,在函数执行完后,会以引用方式反馈,类似C/C++地址引用;

步骤7.2、调用数据转换类对象反射函数getreFlection(),获取协议对象实例的字段属性、自定义注解字段属性、方法函数等;

步骤7.3、调用转换逻辑处理函数,根据自定义注解的字段属性调用相应的基础数据类型互转函数与扩展函数等;

步骤7.5、调用函数处理完毕后,调用反射赋值函数setreFlection()把转换后的数据赋值协议对象实例的字段属性,反馈结果。

上述实施例为本发明较佳的实施方式,但本发明的实施方式并不受所述实施例的限制,其他的任何未背离本发明的精神实质与原理下所作的改变、修饰、替代、组合、简化,均应为等效的置换方式,都包含在本发明的保护范围之内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1