自定义二进制结构化协议数据的发送和接收方法
【技术领域】
[0001 ]本发明涉及数据传输领域,更具体地说,涉及一种自定义二进制结构化协议数据的发送和接收方法。
【背景技术】
[0002]随着计算机网络的发展,基于计算机网络的应用层出不穷,应用数据采取何种协议存在于网络上是所有网络应用都需要考虑的问题。自定义结构体二进制协议便是其中经典的一种,它尤其是在客户/服务器模型的网络应用中得到广泛应用。在现有技术中,通常是直接将结构体所占内存空间的内容作为数据源向网络发送,接收方直接以相同结构体强制还原所收到数据。这样的数据传输方法使用起来很方便。但这种直接以结构体原始内容作为传输内容的通信方式,存在网络带宽浪费严重的问题,如果要通过结构体传输字符串信息,则结构体的字符数组需要按最大字符串要求来定义这个字符串数组,而不能根据实际需要动态决定字符串信息以多大空间来传输。而事实上很多情况下,实际的字符串数据,则往往小于或大大小于这个定段定义时的空间大小。这导致存储空间的严重浪费,这样的数据在网络上传输,也严重浪费了网络带宽。此外,这样的数据传输的安全性不高,因为结构体协议,每种协议大小是固定的,黑客很容易对这种协议数据包进行分析,进而进行攻击。
【发明内容】
[0003]本发明要解决的技术问题在于,针对现有技术的上述浪费严重、不安全的缺陷,提供一种节约网络带宽、较为安全的自定义二进制结构化协议数据的发送和接收方法。
[0004]本发明解决其技术问题所采用的技术方案是:构造一种自定义二进制结构化协议数据的发送方法,包括如下步骤:
A)确认本次需要传输的原始数据所在的第一存储区域;
B)在所述第一存储区域中按数据的存储顺序,依次取得该存储区域中的各数据段,将各数据段中的数据分别转换为包括数据描述单元和数据内容单元的第一格式数据,并将得到的第一格式数据分别按其得到顺序存储在第二存储区域;
C)依次读取多个所述第二存储区域中的第一格式数据,生成数据包并发送;所述数据包包括包头和包数据,其包头中设置有表示本数据包中第一格式数据类型及顺序的第一识别码;
其中,所述数据描述单元用于指示该数据段数据的类型或结构类型,所述数据内容是该数据段中原始数据的实际值转换而得的数据或者是该数据段中原始数据的实际值或字符串。
[0005]更进一步地,所述步骤C)中进一步包括:
Cl)取得多个第一格式数据,使所述多个第一格式数据的长度总和是设定的长度;
C2)按照所述多个第一格式数据的顺序及其数据类型,生成第一识别码,将所述第一识别码放入所述数据包的包头中;
C3)按照读取顺序排列所述多个第一格式数据,得到所述数据包的数据内容。
[0006]更进一步地,所述步骤B)中通过判断当前数据段的数据类型,依据判断结果,分别得到该数据段的数据描述单元和数据内容单元,从而得到该数据段的第一格式数据;
其中,所述数据描述单元通过读取该数据段的原始数据的指定部分得到;根据该数据段的数据类型的不同,所述数据描述单元包括数据类型描述部分或者所述数据描述单元包括数据类型描述部分和数据长度描述部分。
[0007]更进一步地,所述步骤B)中,当所述数据段中为基本数据类型时,取得该基本数据中的有效数字的绝对值,将其与依次与多个设定值比较,得到其第一格式数据中的数据描述单元、数据内容单元的数据以及该数据的长度;
当所述数据段为数组、结构体或容器时,其数据描述单元通过读取当前数据段中的设定内容取得,其转换后的数据内容为该数据段中原始数据的数据内容,其数据长度为第一存储区域中该原始数据的数据长度。
[0008]更进一步地,所述步骤B)中进一步包括:
BI)读取所述第一存储区域中的一个数据段;
B2)判断所述数据段是否为基本数据类型,如是,执行基本数据转换,依次排列得到的数据描述单元和数据内容单元,得到该数据段的第一格式数据;如否,执行步骤B3);
B3)判断所述数据段是否为数组或结构体对象,如是,执行数组或结构体对象转换,依次排列得到的数据描述单元和数据内容单元,得到该数据段的第一格式数据;如否,执行步骤B4);
B4)判断所述数据段是否为容器类型数据,如是,执行容器对象转换,依次排列得到的数据描述单元和数据内容单元,得到该数据段的第一格式数据;如否,则判断当前数据段为字符串,依次排列取得的数据描述单元和原始数据中的字符串部分,得到该数据段的第一格式数据。
[0009]更进一步地,所述步骤B2)中,执行基本数据转换包括:
B21)读取数据段中设定位置,得到该数据段中数据的类型,并判断数据段中的原始数据是否为零,如是,对数据描述单元中的数据类型做出第一类标记,并去掉该数据段的数据内容单元,得到该数据段的第一格式数据;如否,执行下一步骤;
B22)判断所述原始数据取反并加I是否仍等于该原始数据本身,如是,对数据描述单元中的数据类型做出第二类标记,并去掉该数据段的数据内容单元,得到该数据段的第一格式数据;否则,执行下一步骤;
B23)取得所述数据段原始数据的绝对值,将其逐个与设定的值比较,得到该数据段的数据内容单元的长度,将上述步骤中得到的数据类型和所述原始数据的有效值分别放入所述数据描述单元和数据内容单元,得到该数据段的第一格式数据。
[0010]更进一步地,所述步骤B3)中,数据段中的数据是数组或结构体类型,其数据描述单元包括一个字节的、由读取该数据段中指定位置而得到的数据类型描述部分和长度变化的数据长度描述部分;所述数据长度描述部分通过对该数据段中组成该数组或结构体的所有数据长度求和而得;其数据内容单元中的数据是该数据段中所有数组或结构体的原始数据; 所述步骤B4)中,数据段中的数据是容器类型数据,其数据描述单元包括一个字节的数据类型描述部分、一个字节的容器对象类型描述部分和长度变化的数据长度描述部分;所述容器对象类型描述部分通过读取该数据段中原始数据的指定位置而得;所述数据长度描述部分通过对该数据段中组成该容器的所有数据长度求和而得;其数据内容单元中的数据是该数据段中该容器内数据的原始数据。
[0011]本发明还涉及一种接收使用上述方法发送数据的数据接收方法,包括如下步骤:包括如下步骤:
M)接收传来的数据包,取得其包头中表示本数据包中第一格式数据的排列顺序及数据类型的第一识别码,得到本数据包中第一格式数据的数据类型及其排列顺序;
N)依次取得该数据包中的第一格式数据,按照数据描述单元的内容将其数值内容单元转换为原始数据;
O)逐个存储由该数据包中得到的原始数据。
[0012]更进一步地,所述步骤M)中进一步包括:取得该数据包中的第一识别码,查表得到该识别码对应的第一格式数据的数据类型及排列顺序,如该第一识别码不在事先设定的表中,判断该数据包不可用,抛弃该数据包。
[0013]更进一步地,所述步骤N)中,取得一个第一格式数据的数据类型单元后,判断其数据类型,按照对应的数据类型处理该第一格式数据中的数据内容部分,将其转换为原始数据;
其中,所述数据类型包括基本数据类型、数组或结构体对象、容器类型数据或字符串。
[0014]实施本发明的自定义二进制结构化协议数据的发送和接收方法,具有以下有益效果:由于在传输之前对自定义