一种模拟报文发送方法与流程

文档序号:23097429发布日期:2020-11-27 12:59阅读:253来源:国知局
本发明涉及通信
技术领域
:,尤其涉及一种模拟报文发送方法。
背景技术
::目前的以太网测试设备,大多采用的是面向流的阻塞io方法,服务器还是在使用阻塞式的socket连接。使用serversocket.accept方法来创建一个连接。accept方法是阻塞方法,在下一个connection进来之前,accept会阻塞。在一个socket进来之后,tomcat会在threadpool里面拿出一个thread来处理连接的socket。以保护信息主站为例,一台保信主站需要接收上千个子站上传的报文,而且报文的种类多样,配置起来十分复杂,仅仅为了进行通讯测试动用上千台子站显然是不可能的,一般只接入10台以内装置进行测试,这样的测试方法由于样本的缺乏,测试效果并不好。现有技术存在以下缺陷:1.数据多次拷贝标准i/o处理,完成一次完整的数据读写,至少需要从底层硬件读到内核空间,再读到用户文件,又从用户空间写入内核空间,再写入底层硬件此外,底层通过write、read等函数进行i/o系统调用时,需要传入数据所在缓冲区起始地址和长度由于jvmgc的存在,导致对象在堆中的位置往往会发生移动,移动后传入系统函数的地址参数就不是真正的缓冲区地址了可能导致读写出错。2.操作阻塞请求建立连接(connect),读取网络i/o数据(read),发送数据(send)等操作是线程阻塞的。当请求连接已建立,读取请求消息,服务端调用read方法时,如果客户端数据还在写入中或者传输中,线程需要在read方法阻塞等待直到数据就绪。为了实现服务端并发响应,每个连接需要独立的线程单独处理,当并发请求量大时为了维护连接,内存、线程切换开销过大。技术实现要素:针对现有技术中存在的问题,本发明提供一种模拟报文发送方法,一方面优化数据的读写过程,防止缓冲区地址移位导致数据读写出错;另一方面采用非阻塞io,实现一个单独的线程对多个输入和输出通道进行管理。为达到上述目的,本发明提供了一种.一种模拟报文发送方法,包括:在主站部署客户端,选择若干子站,每个子站部署若干服务端;主站对应的所有变电站的所有保护装置向若干子站发送报文;服务端将报文存储到缓冲区(buffer);选择器(selector)扫描各个缓冲区(buffer),当某一缓冲区(buffer)写满后,分配对应的可用通道(channel)发送报文,主站的客户端接收报文。进一步地,所述服务端与保护装置存在对应关系,所述服务端接收对应保护装置发送的报文,存储到缓冲区(buffer)并发送。进一步地,选择器(selector)扫描各个缓冲区(buffer)已写入数据的大小,与存储空间(capacity)进行对比,如果相同,表明已经写满。进一步地,每写入一条信息,位置(position)加1,最后一帧是限制(limit),写模式下存储空间(capacity)与限制帧(limit)相等),当位置(position)与限制帧(limit)相等时时,表明已经写满。进一步地,在服务端创建负责监听ip的套接字(socket)连接;在主线程中注册特征点io事件;当有任何注册的事件发生时,服务端从选择器(selector)中获得相应的选择键(selectionkey),从选择键(selectionkey)中找到发生的事件和所述事件发生的可选通道(selectablechannel),以获得客户端发送的报文;抽取服务端的报文,与发送的报文对比结构是否相同,如果均相同,表明主站报文处理能力满足要求;否则表明主站报文处理能力不满足要求。进一步地,在读模式下,服务端将报文从nio通道中读入nio中的缓冲区(buffer);在写模式下,报文从nio中的缓冲区(buffer)写入nio通道;读报文时,能够读取写入到buffer的所有数据,读完了所有的数据,清空缓冲区。进一步地,读报文时,清空缓冲区包括调用清除函数(clear)清空整个缓冲区或者调用紧凑函数(compact)清除已经读过的报文。进一步地,使用跳转函数(flip)实现写模式和读模式的切换。进一步地,选择至少10个子站,每个子站部署100个客户端。本发明的上述技术方案具有如下有益的技术效果:(1)本发明的模拟报文发送方法可以将复杂的子站系统简化,用一种模拟程序代替子站进行报文发送工作,由于模拟程序的资源占用极低,大约10台部署了模拟程序的机器就可以完成原本上千台子站才能发送的报文量。本方法可以大幅度降低通讯压力测试对装置的需求,并完整地还原现场通讯环境。(2)本发明应用了select机制,将地址信息注册到特定的selector对象上,这就可以在单线程中利用selector对象管理大量并发的网络连接,更好的利用了系统资源。(2)本发明采用非阻塞i/o的通信方式,不要求阻塞等待i/o操作完成即可返回,从而减少了管理i/o连接导致的系统开销,大幅度提高了系统性能。(3)传统io数据流处理:直接从数据流中读一个或多个字节传送到通道,直到读取所有字节,传输过程中没有被缓存在任何地方。这意味着,当一个线程调用read或write时,该线程被阻塞,直到有一些数据被读取,或数据完全写入,该线程在此期间不能再处理其它事件;本发明使用缓冲区代替数据流处理,nio的非阻塞模式,使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取。而不是一直保持线程阻塞,所以直至数据变得可以读取之前,该线程可以继续做其他的事情。一个线程请求写入一些数据到某通道,不需要等待它完全写入,这个线程同时可以去做别的事情,线程通常将非阻塞io的空闲时间用于在其它通道上执行io操作,所以一个单独的线程现在可以管理多个输入和输出通道(channel)。附图说明图1是select机制示意图;图2为nio的非阻塞模式示意图;图3为写模式示意图。具体实施方式为使本发明的目的、技术方案和优点更加清楚明了,下面结合具体实施方式并参照附图,对本发明进一步详细说明。应该理解,这些描述只是示例性的,而并非要限制本发明的范围。此外,在以下说明中,省略了对公知结构和技术的描述,以避免不必要地混淆本发明的概念。本发明提供一种模拟报文发送方法,包括如下步骤:(1)在主站部署客户端,选择若干子站,每个子站部署若干服务端。在服务端程序中创建一个负责监听ip的socket连接后,在主线程中注册感特点io事件,如可读数据到达,新的套接字等等。当有读或者写等任何注册的事件发生时,可以从selector中获得相应的selectionkey,同时从selectionkey中可以找到发生的事件和该事件所发生的具体的selectablechannel,以获得客户端发送过来的数据。(2)主站对应的所有变电站的所有保护装置向若干子站发送报文;服务端将报文存储到缓冲区(buffer)。服务端与保护装置存在对应关系,在一个实施例中采用的是简单的tcp连接方式。使用面向缓冲区的方法代替传统io面向流的方法。nio中的buffer用于和nio通道进行交互,数据是从通道读入缓冲区或从缓冲区写入到通道中。当向buffer写入数据时,buffer会记录下写了多少数据。一旦要读取数据,需要通过flip()方法将buffer从写模式切换到读模式。在读模式下,可以读取之前写入到buffer的所有数据。一旦读完了所有的数据,就需要清空缓冲区,让它可以再次被写入。有两种方式能清空缓冲区:调用clear()或compact()方法。clear()方法会清空整个缓冲区。compact()方法只会清除已经读过的数据。任何未读的数据都被移到缓冲区的起始处,新写入的数据将放到缓冲区未读数据的后面。(3)选择器(selector)扫描各个缓冲区(buffer),当某一缓冲区(buffer)写满后,分配对应的可用通道(channel)发送报文,主站的客户端接收报文。重复执行步骤(3),直至完成主站测试。服务端接收到报文内容存入缓存区(buffer),首先通过allocate方法在缓存区中给报文分配存储空间(capacity),根据报文类型和长度的不同,可以分配不同大小的存储空间(capacity)。缓存区(buffer)具有三个属性:capacity、position以及limit,结合图3。当写入的时候,存储空间(capacity)的大小代表利用allocate初始化时候的大小,代表这个缓存块的容量,最多只能向这个缓存块中放入capacity个char,long,int,byte等等。当缓存块满了的时候需要将其清空,才能继续往里面写数据。position:代笔当前位置,初始化值为0,当一个数据写入buffer中的时候,position会移动到下一个可插入的buffer单元,因此,position的最大值为position-1,limit:在写的模式下面,limit表示你最多可以向buffer里面写入多少个buffer数据,在写模式下面,limit=capacity。当切换到读模式下面,代表最多能读取到多少数据。因此当切换到读模式下面,limit会被置为写模式下面的position值。因此,你能读取到在写模式下面写入的所有值。之后为报文的转发过程,由于一个selector同时注册多个channel,并且可以扫描server中的多个buffer中的报文。由于报文的种类和长度不同,其完成存储的时间也不同。如果采用传统的阻塞性io方法,这种没有应用selector,channel与buffer一对一直接相连,当buffer中报文没有完成存储,则与其对应的channel只能进行待机,这样会造成资源的浪费。而非阻塞性方法,selector通过选择键遍历与其对应的buffer,只要其中有一个buffer准备就绪(选择键只需判定buffer中的capacity属性是否达到最大值,即可判定报文是否存储完成,因此判定速度很快),selector就会把其中报文分配给一个可用的channel(由于buffer中报文的数量远远大于channel的数量),因此几乎可以保证channel中时刻都有报文在写入,可以保证channel被最大化的利用,节约了等待时间。实施例作为本发明方法的实际实施例,某主站实际对应1000个保护装置,需要测试1000个保护装置发送报文的数据量,能否正常处理。本发明通过在10个子站上各部署一个服务端程序,每个服务端程序负责接收100个保护装置发送的报文。每个服务端程序具有指定ip,1000个保护装置,分别向指定ip发送的报文,每个服务端程序负责接收与其同网段保护装置发送的报文,分别存储到缓冲区(buffer)。选择器(selector)扫描各个缓冲区(buffer),当某一缓冲区(buffer)写满后,分配对应的可用通道(channel)发送报文,主站的客户端负责采集所有子站中服务端发送的报文,客户端与实时库存在逻辑连接,会从客户端读取信息存入实时库。主站原本就拥有将保护信息读取到数据库的能力,客户端依托实时库开发,只需要创建一个实时库和服务端的连接。本发明的模拟报文发送方法主要应用在以太网通信测试中,并重点解决了通讯压力测试对设备的数量、性能要求过高的问题。可以将复杂的子站系统简化,用一种模拟程序代替子站进行报文发送工作,由于模拟程序的资源占用极低,大约10台部署了模拟程序的机器就可以完成原本上千台子站才能发送的报文量。本方法可以大幅度降低通讯压力测试对装置的需求,并完整地还原现场通讯环境。综上所述,本发明涉及一种模拟报文发送方法,在主站部署客户端,选择若干子站,每个子站部署若干服务端;主站对应的所有变电站的所有保护装置向若干子站发送报文;服务端将报文存储到缓冲区(buffer);选择器(selector)扫描各个缓冲区(buffer),当某一缓冲区(buffer)写满后,分配对应的可用通道(channel)发送报文,主站的客户端接收报文。本发明的模拟报文发送方法可以将复杂的子站系统简化,用一种模拟程序代替子站进行报文发送工作,由于模拟程序的资源占用极低,大约10台部署了模拟程序的机器就可以完成原本上千台子站才能发送的报文量。本方法可以大幅度降低通讯压力测试对装置的需求,并完整地还原现场通讯环境。应当理解的是,本发明的上述具体实施方式仅仅用于示例性说明或解释本发明的原理,而不构成对本发明的限制。因此,在不偏离本发明的精神和范围的情况下所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。此外,本发明所附权利要求旨在涵盖落入所附权利要求范围和边界、或者这种范围和边界的等同形式内的全部变化和修改例。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1