CN105282128A - 一种基于长连接的双向调用方法及系统 - Google Patents

一种基于长连接的双向调用方法及系统 Download PDF

Info

Publication number
CN105282128A
CN105282128A CN201410438611.4A CN201410438611A CN105282128A CN 105282128 A CN105282128 A CN 105282128A CN 201410438611 A CN201410438611 A CN 201410438611A CN 105282128 A CN105282128 A CN 105282128A
Authority
CN
China
Prior art keywords
remote
local side
remote port
module
call
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN201410438611.4A
Other languages
English (en)
Other versions
CN105282128B (zh
Inventor
宋子龙
倪顺
朱红松
于楠
孙利民
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Institute of Information Engineering of CAS
Original Assignee
Institute of Information Engineering of CAS
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Institute of Information Engineering of CAS filed Critical Institute of Information Engineering of CAS
Priority to CN201410438611.4A priority Critical patent/CN105282128B/zh
Publication of CN105282128A publication Critical patent/CN105282128A/zh
Application granted granted Critical
Publication of CN105282128B publication Critical patent/CN105282128B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Abstract

本发明涉及一种基于长连接的双向调用方法及系统,其方法包括步骤1:本地端发起一个连接请求到远程端;步骤2:本地端和远程端建立连接;步骤3:对远程端连接对象进行序列化,并加载序列化组件对象;步骤4:本地端执行通信线程;步骤5:调用远程方法;步骤6:远程通信线程结束,活跃节点从远程端转移到本地端;步骤7:本地端恢复获得活跃节点,判断当前通信是否完成,如果是,执行步骤8;否则,执行步骤5;步骤8:判断连接是否还存在于远程端,如果是,执行步骤4;否则,执行步骤9;步骤9:关闭连接,清除无效连接对象。本发明通信双方都可以互相调用对方提供的远程对象服务,不会受局域网的限制。

Description

一种基于长连接的双向调用方法及系统
技术领域
本发明涉及一种基于长连接的双向调用方法及系统,属于网络与信息安全技术领域。
背景技术
远程过程调用(RemoteProcedureCall,RPC),是一种计算机通信协议,使用非常广泛。RPC使得一台计算机中运行的程序可以直接调用另一台计算机的子程序。远程过程调用是一个分布式计算的客户端——服务器(CS)的模型。客户端可以向服务器发送一些请求,并提供一定的参数,服务器执行特定的过程之后,将执行结果返回的客户端。
经过长时间的发展,RPC已经有比较多的实现:
1)SunRPC机制的实现是建立在UNIX4.2BSDSOCKET和TCP、UDP协议的基础上,通过一组例程库实现。RPCLibrary包括RPCroutines和XDR(ExternalDataRepresentation)库函数,其中XDR库是一个C函数的集合,是SUN制定的数据表示标准。Java中普通的RPC方法只能传送由XDR定义的数据类型,不能传送对象。
2)DCERPC机制是从Apollo的网络计算系统(NetworkComputingSystem)发展而来。该机制是用接口(interface)机制来协调客户端向服务器的远程过程调用。每个接口包括用接口定义语言(InterfaceDefinitionLanguage)来描述远程调用的一个或多个过程,以及相应的参数。
3)JavaRMI机制,是纯Java的远程方法调用,主要功能就是提供客户端程序调用位于远程服务器上对象所提供的方法,这样可将部分逻辑处理放在远端服务器上。JavaRMI是面向对象的RPC。RMI对象时绑定在本地的,只有远程方法参数和返回值是通过网络传输的。
由于JavaRMI应该很广泛,也能代表现有的较多的RPC,因此在此对其技术细节进行分析,并指出现有RPC的一些缺陷,最后提出新的解决方案。
RMI中有两种特殊类型的对象,称为客户端存根和服务器端框架,这些是RMI的第一层,也是基础层。客户端存根的作用是作为远程服务器的代理,是客户对象;而服务器端框架则是从网路链接中读取客户端的调用参数,向远程服务实现对象进行调用,接受返回值,然后通过链接返回到客户端存根。
远程引用层(RemoteReferenceLayer)则是负责专门的远程方法协议,这一层处理底层远程方法调用连接的调用语义。RemoteReference提供RemoteRef对象,代表远程对象的一个句柄,通过RemoteRef对象,可以执行远程对象方法调用。
传输层(TransportLayer),负责具体的客户端到服务器端的基于流的网络连接。该层负责建立连接、对连接管理、监控连接状态、监听新的调用、维护远程对象表、定位远程调用的调度程序等。
现有的RPC基本都是专注于客户端到服务器端的方法调用,也就是传统的CS结构,因此服务器端也就必须要处于网络可发现状态,这样客户端才能连接上服务器。现有的RPC都存在如下可改进的地方:
1)只能由客户端主动向服务器端进行远程过程调用,而不能支持服务器端到客户端的远程过程调用;
2)仅支持网络全局对象的方法调用,而不支持针对远程局部对象的访问;
在实际分布式网络应用中,RPC使用很广泛。目前的RPC也能满足大部分的远程过程调用需求,然而还存在一些场景,比如:服务器要主动推送数据到客户端,或是调用客户端的一些对象的方法,或是在进行远程过程调用的时候,要将本地局部对象的引用作为参数。在客户端与服务器端的过程调用比较多样、密集的时候,以上场景都常出现。因此非常需要针对这些需求的RPC。
发明内容
在传统模式下,外网的应用不能直接调用内网应用提供的远程对象服务。该RPC组件突破了这一限制,使得内网应用可以向外网应用提供一个远程对象,让外网应用能主动向内网应用发送消息。
本发明所要解决的技术问题是,提供一种适用于不局限于局域网的基于长连接的双向调用方法。
本发明解决上述技术问题的技术方案如下:一种基于长连接的双向调用方法,具体包括以下步骤:
步骤1:本地端作为连接的发起者,多个远程端作为连接的接收者,本地端分别发起连接请求到多个远程端;
步骤2:每个远程端接收一个连接请求,本地端和每个远程端都相应的获得一个进行传输字节流的连接对象,本地端和远程端建立连接;
步骤3:本地端与远程端协商确定一个序列化协议,并使用该协议包装字节流连接,从而提供一个对象传输的通道;
步骤4:远程端将序列化的连接对象发送到本地端,本地端执行通信线程,通信线程内包含栈,当通信线程执行本地代码,通信线程内栈的栈定节点成为活跃节点;
步骤5:调用远程方法,通信线程执行远程代码,远程端出现远程通信线程,活跃节点转移到远程端,本地端进入暂停状态;
步骤6:远程通信线程执行完毕,远程通信线程结束,活跃节点从远程端转移到本地端;
步骤7:本地端恢复获得活跃节点,判断当前通信是否完成,如果是,执行步骤8;否则,执行步骤5;
步骤8:判断连接是否还存在于远程端,如果是,执行步骤4;否则,执行步骤9;
步骤9:关闭连接,清除无效连接对象。
本发明的有益效果是:本发明通信双方都可以互相调用对方提供的远程对象服务,不会受局域网的限制;提供一种类似于本地方法调用的方法调用方式,将远程对象的提供过程设计成参数传递中的传引用方式。
在上述技术方案的基础上,本发明还可以做如下改进。
进一步,所述连接是持久的,被多个远程对象共享;通信双方都可以在这个连接上,为对方提供远程对象,实现“长链接”和“双向”的功能。
进一步,所述步骤9具体包括以下步骤:
步骤9.1:本地端的序列化组件对象向底层的连接对象发送一个关闭连接请求;
步骤9.2:底层的连接对象收到关闭连接请求后,将关闭连接请求发送到远程的连接对象,关闭连接;
步骤9.3:本地端删除无效的序列化组件对象,远程端删除无效的连接对象。
进一步,所述步骤1首先查询本地端所支持的序列化协议,并将这些协议的名字按照最期望使用到最不期望使用的顺序排成一个序列,将该序列转换为元素逗号分隔的字符串,本地端将字符串发送到远程端。
进一步,所述步骤2具体包括以下步骤:
步骤2.1:远程端接收连接请求和字符串,提取其中每一个元素;
步骤2.2:选取一个元素进行检查,判断远程端是否支持,如果是,执行步骤2.4,否则,执行步骤2.3;
步骤2.3:判断是否还有元素未进行检查,如果是,执行步骤2.2;否则,远程端向本地端返回连接失败信息,结束;
步骤2.4:本地端和远程端建立连接,远程端向本地端发布远程对象,本地端获得对应远程对象的引用对象。
进一步,所述步骤5中的调用远程方法采用传引用的方法,传引用方法具体包括以下步骤:
步骤a:本地端在发起对远程端的远程过程调用时,先在本地端检查方法中的所有参数;
步骤b:判断参数中是否包括引用对象,如果是,执行步骤c;否则,执行步骤d;
步骤c:本地端将此参数发布为远程对象;
步骤d:将此调用封装为请求对象和响应对象,并发送到远程端进行处理;
步骤e:远程端接收到请求对象并解析,扫描远程引用参数,并将其中作为引用传输的参数用相应的远程对象代替;远程端继续按照正常的过程执行来自本地端的方法调用;
步骤f:远程端完成方法调用之后,搜集结果并判断结果是否为远程对象;如果是,执行步骤g;否则,执行步骤h;
步骤g:远程端将此结果发布为远程对象;
步骤h:将此结果打包为结果对象,设置好与请求对象对于的编号,发送到客户端。
采用上述进一步方案的有益效果是,采用远程对象的方式来表示对一个对象的引用,结果是需要以引用传输的地方,就会传输过去相应的远程对象,最终在引用上的操作,都会通过这一套远程对象方法调用机制重新作用在原对象上。
进一步,所述步骤1中远程端作为连接的接收者在连接之前已经处在监听状态。
采用上述进一步方案的有益效果是,远程端处于监听状态,等待连接请求,保证本地端发送请求,远程端就能及时接收。
进一步,所述步骤9中连接一旦关闭,该连接对象上将不能再传输任何信息,在它上面做的任何读写操作都将抛出异常,该异常将会沿着序列化组件对象传递给上层的使用者。
进一步,所述本地端以UTF8编码的方式将字符串发送到远程端;远程端以UTF8编码的方式读取字符串,提取其中每一个元素。
本发明所要解决的技术问题是,提供一种适用于不局限于局域网的基于长连接的双向调用系统。
本发明解决上述技术问题的技术方案如下:一种基于长连接的双向调用系统,包括连接请求模块、连接建立模块、方法调用模块、远程完成模块和本地恢复模块;
所述连接请求模块用于本地端作为连接的发起者,多个远程端作为连接的接收者,本地端分别发起连接请求到多个远程端;
所述连接建立模块用于控制每个远程端接收一个连接请求,本地端和每个远程端都相应的获得一个进行传输字节流的连接对象,本地端和远程端建立连接;本地端与远程端协商确定一个序列化协议,并使用该协议包装字节流连接,从而提供一个对象传输的通道;
所述方法调用模块用于远程端将序列化的连接对象发送到本地端,本地端执行通信线程,通信线程内包含栈,当通信线程执行本地代码,通信线程内栈的栈定节点成为活跃节点;所述方法调用模块用于调用远程方法,通信线程执行远程代码,远程端出现远程通信线程,活跃节点转移到远程端,本地端进入暂停状态;
所述远程完成模块用于远程通信线程执行完毕,远程通信线程结束,活跃节点从远程端转移到本地端;
所述本地恢复模块用于本地端恢复获得活跃节点,判断当前通信是否完成,如果是,关闭连接,清除无效连接对象;否则,远程端调用远程方法。
本发明的有益效果是:本发明通信双方都可以互相调用对方提供的远程对象服务,不会受局域网的限制;提供一种类似于本地方法调用的方法调用方式,将远程对象的提供过程设计成参数传递中的传引用方式。
在上述技术方案的基础上,本发明还可以做如下改进。
进一步,所述远程线程模块中的调用远程方法采用传引用系统,所述传引用系统包括调用模块、判断模块、对象封装模块、解析模块、调用判断模块和结果模块;
所述调用模块用于本地端在发起对远程端的远程过程调用时,先在本地端检查方法中的所有参数;
所述判断模块用于判断参数中是否包括引用对象,如果是,本地端将此参数发布为远程对象;否则,直接触发对象封装模块;
所述对象封装模块用于将此调用封装为请求对象和响应对象,并发送到远程端进行处理;
所述解析模块用于远程端接收到请求对象并解析,扫描远程引用参数,并将其中作为引用传输的参数用相应的远程对象代替;远程端继续按照正常的过程执行来自本地端的方法调用;
所述调用判断模块用于远程端完成方法调用之后,搜集结果并判断结果是否为远程对象;如果是,远程端将此结果发布为远程对象;否则,触发结果模块;
所述结果模块用于将此结果打包为结果对象,设置好与请求对象对于的编号,发送到客户端。
附图说明
图1为本发明所述的一种基于长连接的双向调用方法流程图;
图2为本发明所述的一种基于长连接的双向调用方法中关闭连接的方法;
图3为本发明中传引用的方法流程图;
图4为本发明所述的一种基于长连接的双向调用系统结构框图;
图5为本发明中传引用的系统结构框图;
图6为本发明所述的方法调用过程示意图;
图7为本发明所述远程对象方法调用中的线程转移模型;
图8为本发明所述参数与返回值中的传引用实现流程图;
图9为本发明所述的远程对象清除流程图;
图10为本发明所述RPC组件的全部过程流程图。
附图中,各标号所代表的部件列表如下:
1、连接请求模块,2、连接建立模块,3、方法调用模块,4、远程完成模块,5、本地恢复模块,6、调用模块,7、判断模块,8、对象封装模块,9、解析模块,10、调用判断模块,11、结果模块。
具体实施方式
以下结合附图对本发明的原理和特征进行描述,所举实例只用于解释本发明,并非用于限定本发明的范围。
如图1所示,本发明所述的一种基于长连接的双向调用方法,具体包括以下步骤:
步骤1:本地端作为连接的发起者,多个远程端作为连接的接收者,本地端分别发起连接请求到多个远程端;
步骤2:远程端接收连接请求和字符串,提取其中每一个元素;
步骤3:选取一个元素进行检查,判断远程端是否支持,如果是,执行步骤5,否则,执行步骤4;
步骤4:判断是否还有元素未进行检查,如果是,执行步骤3;否则,远程端向本地端返回连接失败信息,结束;
步骤5:本地端与远程端协商确定一个序列化协议,并使用该协议包装字节流连接,从而提供一个对象传输的通道;
步骤6:远程端将序列化的连接对象发送到本地端,本地端执行通信线程,通信线程内包含栈,当通信线程执行本地代码,通信线程内栈的栈定节点成为活跃节点;
步骤7:调用远程方法,通信线程执行远程代码,远程端出现远程通信线程,活跃节点转移到远程端,本地端进入暂停状态;
步骤8:远程通信线程执行完毕,远程通信线程结束,活跃节点从远程端转移到本地端;
步骤9:本地端恢复获得活跃节点,判断当前通信是否完成,如果是,执行步骤10;否则,执行步骤7;
步骤10:判断连接是否还存在于远程端,如果是,执行步骤6;否则,执行步骤11;
步骤11:关闭连接,清除无效连接对象。
如图2所示,为本发明所述的一种基于长连接的双向调用方法中关闭连接的方法,具体包括以下步骤:
步骤11.1:本地端的序列化组件对象向底层的连接对象发送一个关闭连接请求;
步骤11.2:底层的连接对象收到关闭连接请求后,将关闭连接请求发送到远程的连接对象,关闭连接;
步骤11.3:本地端删除无效的序列化组件对象,远程端删除无效的连接对象。
所述步骤1首先查询本地端所支持的序列化协议,并将这些协议的名字按照最期望使用到最不期望使用的顺序排成一个序列,将该序列转换为元素逗号分隔的字符串,本地端将字符串发送到远程端。
如图3所示,为本发明中传引用的方法,所述步骤7中的调用远程方法采用传引用的方法,传引用方法具体包括以下步骤:
步骤a:本地端在发起对远程端的远程过程调用时,先在本地端检查方法中的所有参数;
步骤b:判断参数中是否包括引用对象,如果是,执行步骤c;否则,执行步骤d;
步骤c:本地端将此参数发布为远程对象;
步骤d:将此调用封装为请求对象和响应对象,并发送到远程端进行处理;
步骤e:远程端接收到请求对象并解析,扫描远程引用参数,并将其中作为引用传输的参数用相应的远程对象代替;远程端继续按照正常的过程执行来自本地端的方法调用;
步骤f:远程端完成方法调用之后,搜集结果并判断结果是否为远程对象;如果是,执行步骤g;否则,执行步骤h;
步骤g:远程端将此结果发布为远程对象;
步骤h:将此结果打包为结果对象,设置好与请求对象对于的编号,发送到客户端。
采用远程对象的方式来表示对一个对象的引用,结果是需要以引用传输的地方,就会传输过去相应的远程对象,最终在引用上的操作,都会通过这一套远程对象方法调用机制重新作用在原对象上。
所述步骤1中远程端作为连接的接收者在连接之前已经处在监听状态。远程端处于监听状态,等待连接请求,保证本地端发送请求,远程端就能及时接收。
所述步骤11中连接一旦关闭,该连接对象上将不能再传输任何信息,在它上面做的任何读写操作都将抛出异常,该异常将会沿着序列化组件对象传递给上层的使用者。
所述本地端以UTF8编码的方式将字符串发送到远程端;远程端以UTF8编码的方式读取字符串,提取其中每一个元素。
如图4所示,为本发明具体实施例1所述的一种基于长连接的双向调用系统,包括连接请求模块1、连接建立模块2、方法调用模块3、远程完成模块4和本地恢复模块5;
所述连接请求模块1用于本地端作为连接的发起者,多个远程端作为连接的接收者,本地端分别发起连接请求到多个远程端;
所述连接建立模块2用于控制每个远程端接收一个连接请求,本地端和每个远程端都相应的获得一个进行传输字节流的连接对象,本地端和远程端建立连接;本地端与远程端协商确定一个序列化协议,并使用该协议包装字节流连接,从而提供一个对象传输的通道;
所述方法调用模块3用于远程端将序列化的连接对象发送到本地端,本地端执行通信线程,通信线程内包含栈,当通信线程执行本地代码,通信线程内栈的栈定节点成为活跃节点;所述方法调用模块用于调用远程方法,通信线程执行远程代码,远程端出现远程通信线程,活跃节点转移到远程端,本地端进入暂停状态;
所述远程完成模块4用于远程通信线程执行完毕,远程通信线程结束,活跃节点从远程端转移到本地端;
所述本地恢复模块5用于本地端恢复获得活跃节点,判断当前通信是否完成,如果是,关闭连接,清除无效连接对象;否则,远程端调用远程方法。
所述方法调用模块3中的调用远程方法采用传引用系统,如图5所示,所述传引用系统包括调用模块6、判断模块7、对象封装模块8、解析模块9、调用判断模块10和结果模块11;
所述调用模块6用于本地端在发起对远程端的远程过程调用时,先在本地端检查方法中的所有参数;
所述判断模块7用于判断参数中是否包括引用对象,如果是,本地端将此参数发布为远程对象;否则,直接触发对象封装模块;
所述对象封装模块8用于将此调用封装为请求对象和响应对象,并发送到远程端进行处理;
所述解析模块9用于远程端接收到请求对象并解析,扫描远程引用参数,并将其中作为引用传输的参数用相应的远程对象代替;远程端继续按照正常的过程执行来自本地端的方法调用;
所述调用判断模块10用于远程端完成方法调用之后,搜集结果并判断结果是否为对象;如果是,远程端将此结果发布为远程对象;否则,触发结果模块;
所述结果模块11用于将此结果打包为结果对象,设置好与请求对象对于的编号,发送到客户端。
以下实施例以客户端作为本地端,服务器端作为远程端。
该基于长连接的双向过程调用机制是基于接口的。客户端和服务器端使用同一套接口,服务器端可以先发布一些远程对象供客户端调用其方法。
在本发明所述方法中,远程对象分为全局远程对象和局部远程对象。在传统的远程对象中,对象的识别方式为URI,即每个远程对象将对应一个URI。URI可以认为是网络环境中一个对象名字,也可以认为是网络环境中的全局对象。而在该RPC机制中,还支持局部对象的概念。局部对象生命周期较短,命名也较全局对象随意。对于局部对象的支持,是靠本机制中“传引用”功能所实现的。
传引用的目的在于让对获得的对象的操作都在原对象身上生效。而获得的对象,即远程对象,也就是远程引用了。传引用,就是将参数或者返回值中的对象也做成远程对象,并提供给远程使用。
在Java语言中,并没有特别的用一些标识来区分在函数参数是传值还是传引用。而在VisualBasic、C++等都有“ByRef”、“&”等标识来特别地区分出传引用。在本系统中,使用“ByRef”标识来区分传引用,从而使得另一端对该引用对象的调用访问会反馈到原对象中。如此,也能实现局部对象发布,供另一端访问。
在传引用中,采用远程对象的方式来表示对一个对象的引用,结果是需要以引用传输的地方,就会传输过去相应的远程对象,最终在引用上的操作,都会通过这一套远程对象方法调用机制重新作用在原对象上。传引用的具体步骤如下:
1)即客户端在方法调用之前,检查方法中的参数,将需要以引用方式(带有ByRef注解)传输的对象发布为远程对象;
2)进入正常的远程调用途径,将方法调用请求发送到远程服务器端;
3)服务器端接收到方法调用请求时,扫描所有的参数,并将其中作为引用传输的参数用相应的远程对象代替;
4)而后执行方法调用过程;
5)方法调用完成之后,搜集结果并判断结果是否需要以引用的方式传递。如果需要,则执行与客户端相同的对象的发布过程,然后返回;
6)客户端接收到结果之后,根据是否为引用解析相应的结果,并返回给用户。
针对不同的远程对象,他们有不同的生命周期。远程对象分为两类:一类是全局型的远程对象;另一类是局部型的远程对象。全局型的远程对象开始于将对象与一个名字绑定。最后当某些条件(比如系统关机)达成时,此对象与相应的名字解绑定,其生命周期结束。而对于局部对象,他是源自于过程调用的参数,此时源端的对象自动成为一个远程对象被交互的另一端使用。当另一端不再需要使用该远程对象时,则此局部远程对象的生命周期结束。
当对象生命周期结束时,有两件事情需要做:1)通知可能依赖于目标对象的过程,该对象生命周期结束的事件;2)清除该对象作为远程对象存在时留下的各种残留。
向对该对象存在依赖的对象通知该事件,本系统采用了事件机制,即当某个过程依赖于该对象,并且希望获知该事件的对象可以通过设置这一个监听关系就能在事件发生时得到相应的事件通知。
而当一个对象生命周期结束时,系统中可能存在的残留包括:远程主机对该对象的引用、该对象上未完成的方法调用等。当检测到一个对象生命周期结束时(比如通过检测GC的对象回收过程),通过某种方式获取到相应的标识符,然后通知远程主机该对象已经无效的事件。远程主机上收到该消息之后,也作相应的处理。
针对系统残留处理,这里采用心跳包的方式解决问题。即两台主机都定时检查本机上的远程对象,并向远程查询相应的对象的存在性。当任何一端确定某对象已经不存在,那么该对象就已经可以清除了。因为只在一端存在的远程对象,实现不了通信,从而也就失去了远程对象的意义。使用这种心跳机制,如果存在某个对象因为某种原因,在一端清除了而另一段没有的情况下,下一次的查询过程就必定能够重新获取“该对象已失效”的信息,从而可以重新启动他的清除过程,保证无效对象的成功清除。
下面参照附图并结合实施例对本发明进行详细的描述。
本发明其步骤包括:
a)该双向调用的远程对象服务机制由连接建立、远程调用、对象善后处理等组成;
b)连接建立说明了远程服务建立的过程。客户端和服务器端之间的通信过程要将对象进行序列化,再进行传输。在建立连接之前,客户端和服务器端之间要进行握手,将所支持的序列化协议进行比对,最终确定客户端和服务器端都支持的一种协议作为序列化协议;
c)远程过程调用说明了双向远程对象服务的建立。服务器端会发布远程对象,供客户端进行远程调用。客户端在调用时,会包装和发送请求对象给服务器端,如果调用参数包括局部对象,则也会将此对象发布为远程对象。服务器端会解析请求对象,并执行调用过程,其中也可能会涉及到对客户端的远程对象的反向调用。服务器端搜集调用结果,封装为结果对象返回给客户端;
d)当调用过程正常结束后,连接断开时,要涉及到远程对象的善后处理。主要通过Java的GC机制等对远程对象进行清理。
使用双向连接,使得客户端不受局域网的限制,也可以发布远程对象服务,供服务器端进行调用。当然,客户端和服务器都在广域网中,或是都在局域网中,也可以使用双向连接的特性;
客户端向服务器端发起的远程过程调用的请求对象中,如果含有特定对象,则需要发布为远程对象。这样服务器可以获得有状态的客户端对象,其对此对象的操作会反馈会客户端。
服务器端的调用结果如果是一个对象,则会再度发布为一个远程对象,将其引用封装为结果对象传回客户端。客户端可以进行解析结果对象,获得调用结果。
客户端和服务器端上的远程对象如果没有被引用了,则会由Java的GC回收机制来清理这些远程对象。当一个对象生命周期结束了,系统中可能存在的残留包括:远程主机对此对象的引用、此对象上未完成的方法调用等。系统检查到本地一个对象结束后,则会通知远程主机该对象已经无效,从而也对这些残留对象进行处理。
连接建立过程:
在本系统中,在客户端和服务器端进行连接和通信的时候,将这一过程分为了两部分:1)对象序列化部分;2)数据传输部分。其中,对象序列号部分的角色就是一个适配器,而且它就是最终被外部使用的对象。在进行远程过程调用的过程中,在传输参数的过程中,对象被序列化,这样就能通过网络传输了。
一个连接的建立,存在两个角色,连接的发起者和连接的接受者。连接的接受者需要在建立连接之前就已经处于监听状态,等候连接的请求。而后连接发起者发起一个连接,接受者接受该连接请求,两端都相应地获得一个能传输字节流的连接对象。
连接握手期:
这一个阶段的作用是确定通信双方使用的序列化协议,并加载上响应序列化组件实例。
首先是连接的发起端,查询本机所支持的序列化协议,并将这些协议的名字按照最期望使用到最不期望使用的顺序排成一个序列。而后将该序列表示成元素逗号分隔得字符串,并以UTF8编码的方式(这一个时期内,后面的字符串传输都采用这种方式)将该字符串(后带一个回车换行符<CR><LF>)通过上一步中获得的字节流连接发送给远程;而后进入读取状态,等待对方发送回来的结果。
连接的接收端则以UTF8的方式从第一步获得的流中读取一行(到回车换行符<CR><LF>结束),而后将改行以逗号分隔的方式,取出其中的每一个元素;而后依次检查这每一个元素本机是否支持,直到找到第一个支持的为止。如果找到了支持的,则发回连接的发起端一个字符串“ACCEPTED:<SERIALIZATION_PROTOCOL_NAME>”,如果没有找到支持的,就往回发送“DENIED”字符串,两种方式都以回车换行符<CR><LF>结尾。如果有找到支持的协议,意味着相应的连接是可以建立的,查找相应的序列化组件,并在该连接上构建他的序列化组件实例。
连接发起端在接收端发送回来结果的时候。解析是否被远程接受,被接受的情况下,所使用的序列化协议名字是什么,然后使用该协议在第一个时期获得的连接上创建一个序列化组件实例。如果连接被拒绝则回收第一个时期获得的连接资源,并宣告连接失败。
通信期:
在完成连接建立期和连接握手期之后,就可以得到一个可以传输对象的通信连接了,用于进行方法调用中的数据包对象的传递。
假设远程进程中存在一个对象a,本机上通过某种途径获取了该对象的一个远程引用a’。然后在a’上执行它所提供的某函数(假设为Stringmethod0()),那么该函数的执行过程将会在远程的对象a上发生。方法调用的具体过程如表1所示:
表1
本系统支持双向的远程过程调用,即服务器端也可以去调用客户端发布的远程对象。具体步骤见图6。
这里描述的远程调用的过程中的两个线程(客户端调用该方法的线程和服务器端为响应该方法调用而启动的新线程),各自都有一个“栈”结构,一个在本机一个在远程。但是这两个“栈”中,只存在一个“活跃结点”。即,当线程还是在运行本机代码的时候,“活跃结点”就是当前“栈”的“栈顶结点”。而当调用了远程方法,当前“栈”就进入了暂停状态,所以不再具备“活跃结点”;而此时远程会出现一个新的线程执行目标函数,该线程处于活跃状态,所以获得了“活跃结点”。当远程的函数执行完毕时,远程的线程消失,而本机的线程恢复执行过程,所以本机的线程又重新获得了“活跃结点”。所以这个过程可以认为是“活跃结点”在本机和远程之间发生了转移。从这一角度看,远程过程调用就非常像本地方法调用,只不过发生了调用栈的转移。具体如图7所示。
在对远程过程调用过程中,会涉及到很多的引用类型的对象作为参数。源端会传输给另一端相应的远程对象,最终另一端在引用对象上的操作,都会通过这一套远程对象方法调用机制重新作用在原对象上。如图8所示,带有引用对象作为参数的远程过程调用步骤为:
1)客户端在发起对服务器的远程过程调用时,先在客户端检查方法中的所有参数,如果有以“ByRef”作为注解的对象,则将此对象发布为远程对象;
2)客户端通过网络连接将方法调用请求发送到远程服务器端;
3)服务器端接收到方法调用请求时,扫描所有的参数,并将其中作为引用传输的参数用相应的远程对象代替;
4)服务器端继续按照正常的过程执行该来自客户端的方法调用;
5)服务器端完成方法调用之后,从本机搜集结果并判断是否需要引用的方式传递会客户端。如果结果只是一个数据,则直接返回即可。如果结果是一个引用对象,则也同样需要将此对象发布,然后远程引用传回给客户端。
6)客户端收到来自服务器的结果之后,根据此结果的类型,而进行不同的解析过程。如果是引用,则是将远程引用返回给用户,从而还可以进行对此对象的远程访问。
结束期:
当通信工作完成的时候,或者是不可恢复的通信异常(比如网络断了,串口松开了)的时候,该通信的连接就会将进入断开阶段。
进入连接断开阶段之后,序列化组件对象将向底层的连接对象发送一个关闭连接的请求。连接对象收到该请求之后,将会把信息告诉远程的连接对象,而后关闭连接。连接一旦关闭,该连接对象上将不能再传输任何信息,在它上面做的任何读写操作都将抛出异常,该异常将会沿着序列化组件对象传递给上层的使用者。
此时,也需要将远程对象进行善后处理。如图9所示,当一端的对象生命周期结束时(比如通过检测GC的对象回收过程),通过某种方式获取到相应的标识符,然后通知远程主机该对象已经无效,远程主机收到此消息后,也作相应的处理。
如图10所示,本发明所述RPC组件的全部过程流程图具体步骤如下:
步骤1:服务器准备好进行监听;
步骤2:客户端发出连接请求,服务器接收,确定连接握手,确定双方通信序列化协议,并在客户端和服务器上加载响应序列化组件实例;
步骤3:服务器发表远程对象(例如:对象a);
步骤4:客户端获得对应远程对象的远程引用对象(例如:对象a,);
步骤5:客户端调用a,.method()方法,扫描参数;
步骤6:客户端判断参数中是否有引用对象,如果是,执行步骤7;否则,执行步骤8;
步骤7:客户端将此参数发布为远程对象;
步骤8:将此远程对象封装为请求对象和响应对象并发送到服务器;
步骤9:服务器接收请求对象并进行解析,处理远程引用参数,调用本地过程处理,执行a.method();
步骤10:服务器收集执行结果,判断执行结果是否为对象,如果是,执行步骤11;否则,执行步骤12:
步骤11:服务器将执行结果发布为远程对象;
步骤12:将执行结果打包为结果对象,设置好与请求对象对于的编号,发送到客户端;
步骤13:客户端接收到结果对象,根据其编号,传递到对应的响应对象;
步骤14:激活客户端线程,解析相应对象,a,.method()进行返回;
步骤15:完成通信,断开连接,客户端和服务器通过GC回收或其他机制进行远程对象的善后处理;
步骤16:服务器在连接断开后恢复到监听状态。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

Claims (10)

1.一种基于长连接的双向调用方法,其特征在于,具体包括以下步骤:
步骤1:本地端作为连接的发起者,多个远程端作为连接的接收者,本地端分别发起连接请求到多个远程端;
步骤2:每个远程端接收一个连接请求,本地端和每个远程端都相应的获得一个进行传输字节流的连接对象,本地端和远程端建立连接;
步骤3:本地端与远程端协商确定一个序列化协议,并使用该协议包装字节流连接,从而提供一个对象传输的通道;
步骤4:远程端将序列化的连接对象发送到本地端,本地端执行通信线程,通信线程内包含栈,当通信线程执行本地代码,通信线程内栈的栈定节点成为活跃节点;
步骤5:调用远程方法,通信线程执行远程代码,远程端出现远程通信线程,活跃节点转移到远程端,本地端进入暂停状态;
步骤6:远程通信线程执行完毕,远程通信线程结束,活跃节点从远程端转移到本地端;
步骤7:本地端恢复获得活跃节点,判断当前通信是否完成,如果是,执行步骤8;否则,执行步骤5;
步骤8:判断连接是否还存在于远程端,如果是,执行步骤4;否则,执行步骤9;
步骤9:关闭连接,清除无效连接对象。
2.根据权利要求1所述的一种基于长连接的双向调用方法,其特征在于,所述步骤9具体包括以下步骤:
步骤9.1:本地端的序列化组件对象向底层的连接对象发送一个关闭连接请求;
步骤9.2:底层的连接对象收到关闭连接请求后,将关闭连接请求发送到远程的连接对象,关闭连接;
步骤9.3:本地端删除无效的序列化组件对象,远程端删除无效的连接对象。
3.根据权利要求2所述的一种基于长连接的双向调用方法,其特征在于,所述步骤1首先查询本地端所支持的序列化协议,并将这些协议的名字按照最期望使用到最不期望使用的顺序排成一个序列,将该序列转换为元素逗号分隔的字符串,本地端将字符串发送到远程端。
4.根据权利要求3所述的一种基于长连接的双向调用方法,其特征在于,所述步骤2具体包括以下步骤:
步骤2.1:远程端接收连接请求和字符串,提取其中每一个元素;
步骤2.2:选取一个元素进行检查,判断远程端是否支持,如果是,执行步骤2.4,否则,执行步骤2.3;
步骤2.3:判断是否还有元素未进行检查,如果是,执行步骤2.2;否则,远程端向本地端返回连接失败信息,结束;
步骤2.4:本地端和远程端建立连接,远程端向本地端发布远程对象,本地端获得对应远程对象的引用对象。
5.根据权利要求1-4任一项所述的一种基于长连接的双向调用方法,其特征在于,所述步骤5中的调用远程方法采用传引用的方法,传引用方法具体包括以下步骤:
步骤a:本地端在发起对远程端的远程过程调用时,先在本地端检查方法中的所有参数;
步骤b:判断参数中是否包括引用对象,如果是,执行步骤c;否则,执行步骤d;
步骤c:本地端将此参数发布为远程对象;
步骤d:将此调用封装为请求对象和响应对象,并发送到远程端进行处理;
步骤e:远程端接收到请求对象并解析,扫描远程引用参数,并将其中作为引用传输的参数用相应的远程对象代替;远程端继续按照正常的过程执行来自本地端的方法调用;
步骤f:远程端完成方法调用之后,搜集结果并判断结果是否为远程对象;如果是,执行步骤g;否则,执行步骤h;
步骤g:远程端将此结果发布为远程对象;
步骤h:将此结果打包为结果对象,设置好与请求对象对于的编号,发送到客户端。
6.根据权利要求5所述的一种基于长连接的双向调用方法,其特征在于,所述步骤1中远程端作为连接的接收者在连接之前已经处在监听状态。
7.根据权利要求6所述的一种基于长连接的双向调用方法,其特征在于,所述步骤9中连接一旦关闭,该连接对象上将不能再传输任何信息,在它上面做的任何读写操作都将抛出异常,该异常将会沿着序列化组件对象传递给上层的使用者。
8.根据权利要求7所述的一种基于长连接的双向调用方法,其特征在于,所述本地端与远程端的连接是持久的,本地端与多个远程端共享。
9.一种基于长连接的双向调用系统,其特征在于,包括连接请求模块、连接建立模块、方法调用模块、远程完成模块和本地恢复模块;
所述连接请求模块用于本地端作为连接的发起者,多个远程端作为连接的接收者,本地端分别发起连接请求到多个远程端;
所述连接建立模块用于控制每个远程端接收一个连接请求,本地端和每个远程端都相应的获得一个进行传输字节流的连接对象,本地端和远程端建立连接;本地端与远程端协商确定一个序列化协议,并使用该协议包装字节流连接,从而提供一个对象传输的通道;
所述方法调用模块用于远程端将序列化的连接对象发送到本地端,本地端执行通信线程,通信线程内包含栈,当通信线程执行本地代码,通信线程内栈的栈定节点成为活跃节点;所述方法调用模块用于调用远程方法,通信线程执行远程代码,远程端出现远程通信线程,活跃节点转移到远程端,本地端进入暂停状态;
所述远程完成模块用于远程通信线程执行完毕,远程通信线程结束,活跃节点从远程端转移到本地端;
所述本地恢复模块用于本地端恢复获得活跃节点,判断当前通信是否完成,如果是,关闭连接,清除无效连接对象;否则,远程端调用远程方法。
10.根据权利要求9所述的一种基于长连接的双向调用系统,其特征在于,所述远程线程模块中的调用远程方法采用传引用系统,所述传引用系统包括调用模块、判断模块、对象封装模块、解析模块、调用判断模块和结果模块;
所述调用模块用于本地端在发起对远程端的远程过程调用时,先在本地端检查方法中的所有参数;
所述判断模块用于判断参数中是否包括引用对象,如果是,本地端将此参数发布为远程对象;否则,直接触发对象封装模块;
所述对象封装模块用于将此调用封装为请求对象和响应对象,并发送到远程端进行处理;
所述解析模块用于远程端接收到请求对象并解析,扫描远程引用参数,并将其中作为引用传输的参数用相应的远程对象代替;远程端继续按照正常的过程执行来自本地端的方法调用;
所述调用判断模块用于远程端完成方法调用之后,搜集结果并判断结果是否为远程对象;如果是,远程端将此结果发布为远程对象;否则,触发结果模块;
所述结果模块用于将此结果打包为结果对象,设置好与请求对象对于的编号,发送到客户端。
CN201410438611.4A 2014-08-29 2014-08-29 一种基于长连接的双向调用方法及系统 Active CN105282128B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201410438611.4A CN105282128B (zh) 2014-08-29 2014-08-29 一种基于长连接的双向调用方法及系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201410438611.4A CN105282128B (zh) 2014-08-29 2014-08-29 一种基于长连接的双向调用方法及系统

Publications (2)

Publication Number Publication Date
CN105282128A true CN105282128A (zh) 2016-01-27
CN105282128B CN105282128B (zh) 2018-10-16

Family

ID=55150463

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201410438611.4A Active CN105282128B (zh) 2014-08-29 2014-08-29 一种基于长连接的双向调用方法及系统

Country Status (1)

Country Link
CN (1) CN105282128B (zh)

Cited By (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106453336A (zh) * 2016-10-20 2017-02-22 杭州孚嘉科技有限公司 一种内网主动提供外网主机调用服务的方法
CN106712959A (zh) * 2016-12-09 2017-05-24 深圳竹信科技有限公司 一种通信安全的实现方法及系统
CN107659670A (zh) * 2017-11-09 2018-02-02 成都正光恒电子科技有限责任公司 基于物联网的企事业信息系统
CN108763200A (zh) * 2018-05-15 2018-11-06 达而观信息科技(上海)有限公司 中文分词方法及装置
CN108897629A (zh) * 2018-06-01 2018-11-27 山东中创软件商用中间件股份有限公司 一种ejb调用参数传递方法及相关装置
CN109669793A (zh) * 2018-12-24 2019-04-23 中国人民解放军国防科技大学 中间件进程内对象调用方法
CN110855726A (zh) * 2018-08-20 2020-02-28 北京京东尚科信息技术有限公司 通信方法、装置以及网关、计算设备和介质
CN111787067A (zh) * 2020-06-08 2020-10-16 浙江保融科技有限公司 一种多银行银企直联远程服务调用、管理方法

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20030200329A1 (en) * 2002-04-23 2003-10-23 Delaney William P. Polling-based mechanism for improved RPC timeout handling
CN1852209A (zh) * 2006-05-31 2006-10-25 北京和利时系统工程股份有限公司 一种分布式控制系统中的远程过程调用方法及系统
CN102279773A (zh) * 2011-07-28 2011-12-14 迈普通信技术股份有限公司 一种双向远程调用的方法和系统
CN103339910A (zh) * 2010-11-08 2013-10-02 谷歌公司 通过基于远程过程调用的通信协议的全双工双向通信、及其应用
CN104486330A (zh) * 2014-12-11 2015-04-01 上海爱数软件有限公司 一种基于远程过程调用的双向通信系统

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20030200329A1 (en) * 2002-04-23 2003-10-23 Delaney William P. Polling-based mechanism for improved RPC timeout handling
CN1852209A (zh) * 2006-05-31 2006-10-25 北京和利时系统工程股份有限公司 一种分布式控制系统中的远程过程调用方法及系统
CN103339910A (zh) * 2010-11-08 2013-10-02 谷歌公司 通过基于远程过程调用的通信协议的全双工双向通信、及其应用
CN102279773A (zh) * 2011-07-28 2011-12-14 迈普通信技术股份有限公司 一种双向远程调用的方法和系统
CN104486330A (zh) * 2014-12-11 2015-04-01 上海爱数软件有限公司 一种基于远程过程调用的双向通信系统

Cited By (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106453336A (zh) * 2016-10-20 2017-02-22 杭州孚嘉科技有限公司 一种内网主动提供外网主机调用服务的方法
CN106712959A (zh) * 2016-12-09 2017-05-24 深圳竹信科技有限公司 一种通信安全的实现方法及系统
CN106712959B (zh) * 2016-12-09 2019-12-13 深圳竹信科技有限公司 一种通信安全的实现方法及系统
CN107659670A (zh) * 2017-11-09 2018-02-02 成都正光恒电子科技有限责任公司 基于物联网的企事业信息系统
CN108763200A (zh) * 2018-05-15 2018-11-06 达而观信息科技(上海)有限公司 中文分词方法及装置
CN108897629A (zh) * 2018-06-01 2018-11-27 山东中创软件商用中间件股份有限公司 一种ejb调用参数传递方法及相关装置
CN110855726A (zh) * 2018-08-20 2020-02-28 北京京东尚科信息技术有限公司 通信方法、装置以及网关、计算设备和介质
CN110855726B (zh) * 2018-08-20 2024-02-06 北京京东尚科信息技术有限公司 通信方法、装置以及网关、计算设备和介质
CN109669793A (zh) * 2018-12-24 2019-04-23 中国人民解放军国防科技大学 中间件进程内对象调用方法
CN109669793B (zh) * 2018-12-24 2022-11-15 中国人民解放军国防科技大学 中间件进程内对象调用方法
CN111787067A (zh) * 2020-06-08 2020-10-16 浙江保融科技有限公司 一种多银行银企直联远程服务调用、管理方法

Also Published As

Publication number Publication date
CN105282128B (zh) 2018-10-16

Similar Documents

Publication Publication Date Title
CN105282128A (zh) 一种基于长连接的双向调用方法及系统
EP3389219B1 (en) Access request conversion method and device
CN103297475B (zh) Mock服务系统及Mock服务的处理方法
CN102377814B (zh) 针对嵌入式操作系统的远程协助服务方法
CN104219316A (zh) 一种分布式系统中的调用请求处理方法及装置
CN105681462A (zh) 一种基于消息路由的集群系统及数据通信中转方法
CN108063813B (zh) 一种集群环境下密码服务网络并行化的方法与系统
CN111917737B (zh) 一种跨网rpc调用系统及方法
JP2002543491A (ja) 分散コンピューティング環境のための通信アーキテクチャ
CN104811922A (zh) 一种相邻节点注册方法和装置、跨节点注册方法和系统
CN102195882A (zh) 根据数据流应用类型选路的方法及装置
CN114338650A (zh) 文件传输方法、装置、电子设备及可读存储介质
CN105635083A (zh) 基于服务器和客户端架构的业务处理方法及业务处理系统
WO2023093039A1 (zh) 一种进程间通讯方法及系统
CN113746928A (zh) 跨云服务调用方法、装置和系统
CN111352716B (zh) 一种基于大数据的任务请求方法、装置、系统及存储介质
CN105847179A (zh) 一种dpi系统中数据并发上报的方法及装置
CN105959385A (zh) 一种信息通信方法、装置及系统
CN113630301B (zh) 基于智能决策的数据传输方法、装置、设备及存储介质
CN110661780A (zh) 一种基于saas应用的无线城市数据共享方法与系统
CN102036188A (zh) 多节点系统下的邮件代理方法、设备和系统
CN116192863B (zh) 微服务流量处理方法、dpu服务网格部署方法及系统
CN106209951A (zh) 信息传输方法、客户端及服务器
WO2023109475A1 (zh) 一种处理调用的方法、系统和设备
CN113992740A (zh) 一种基于自主可控的中间件及数据传输方法

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant