发明内容
为了解决非远程对象远程访问失败的问题,本发明实施例提供了一种访问非远程对象的方法和装置。所述技术方案如下:
一种访问非远程对象的方法,所述方法包括:
服务器端的转发器接收客户端发起的对目标对象的调用请求,所述目标对象是非远程对象;
所述转发器将所述调用请求转发给所述目标对象,并接收所述目标对象发送的所述调用请求对应的返回值;
如果所述返回值不是可传输类型、并且所述返回值实现有一接口,所述转发器根据所述返回值构造可被远程访问的另一转发器,并创建所述另一转发器的桩Stub;
其中,所述Stub是一种本地代理,用于代理远程主机上的远程对象,它与远程对象实现相同的接口,负责接收来自本地的方法调用,并在后台发起对远程对象的网络连接,完成实际的远程调用,调用完成后,把调用结果返回给本地客户。
所述转发器将所述另一转发器的Stub发送给所述客户端,使所述客户端根据所述另一转发器的Stub创建调用处理器,并根据所述调用处理器和所述返回值的接口构造并返回动态远程代理给客户。
其中,所述服务器端的转发器接收客户端发起的对目标对象的调用请求之前包括:
所述客户端获取所述转发器的Stub;
所述客户端根据所述转发器的Stub,创建另一调用处理器;
所述客户端根据所述另一调用处理器和所述目标对象的接口,构造另一动态远程代理;
所述客户端根据所述另一动态远程代理向所述转发器发起对所述目标对象的调用请求。
其中,所述方法还包括:
如果所述返回值是可传输类型,所述转发器将所述返回值发送给所述客户端,使所述客户端将所述返回值返回给客户。
其中,所述可传输类型包括:基本类型、远程对象和可序列化对象。
一种访问非远程对象的装置,所述装置包括:
接收模块,用于接收客户端发起的对目标对象的调用请求,所述目标对象是非远程对象;
收发模块,用于将所述接收模块接收的调用请求转发给所述目标对象,并接收所述目标对象发送的所述调用请求对应的返回值;
构造模块,用于如果所述收发模块接收的返回值不是可传输类型、并且所述返回值实现有一接口,根据所述返回值构造可被远程访问的另一转发器,并创建所述另一转发器的桩Stub;
其中,所述Stub是一种本地代理,用于代理远程主机上的远程对象,它与远程对象实现相同的接口,负责接收来自本地的方法调用,并在后台发起对远程对象的网络连接,完成实际的远程调用,调用完成后,把调用结果返回给本地客户。
发送模块,用于将所述另一转发器的Stub发送给所述客户端,使所述客户端根据所述另一转发器的Stub创建调用处理器,并根据所述调用处理器和所述返回值的接口构造并返回动态远程代理给客户。
其中,所述装置还包括:
第二发送模块,用于如果所述收发模块接收的返回值是可传输类型,将所述返回值发送给所述客户端,使所述客户端将所述返回值返回给客户。
其中,所述构造模块或所述第二发送模块的可传输类型包括:基本类型、远程对象和可序列化对象。
其中,所述装置是一转发器。
本发明实施例提供的技术方案带来的有益效果是:
一方面,通过在服务器端设置一个转发器作为目标对象的伴随对象,在客户端设置一个调用处理器与之相配合,该服务器端的转发器自动处理对目标对象方法调用的返回值,对于无法在网络上传输的返回值,构造新的转发器返回给客户端,该客户端的调用处理器对服务器的返回值进行判断处理,如果服务器返回的是另一转发器,则客户端根据另一转发器的Stub创建调用处理器,并根据调用处理器和返回值的接口构造并返回动态远程代理给客户,后续如果客户需要,可再执行动态远程代理中的方法发起远程调用,另外,如果服务器的返回值可以在网络上传输,则直接返回给客户,从而有效解决了非远程对象远程访问失败的问题。
另一方面,服务器端的转发器和客户端的另一远程调用处理器是两个现成组件,用户在对目标对象开始实施远程调用时,仅在开始分别在服务器端和客户端实例化这两个组件,即可进行调用,而后续若对返回对象再实施调用,则无需作任何额外的动作,因为转发器和远程调用处理器会自动再生成后续的返回对象的转发器和远程调用处理器,从而实现调用的简单化和自动化。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述。
实施例1
参见图1,本实施例提供了一种访问非远程对象的方法,包括:
101:服务器端的转发器接收客户端发起的对目标对象的调用请求,目标对象是非远程对象;
进一步的,步骤101之前,客户端获取转发器的Stub,根据转发器的Stub,创建另一调用处理器,根据另一调用处理器和目标对象的接口,构造另一动态远程代理,根据另一动态远程代理向转发器发起对目标对象的调用请求。
102:转发器将调用请求转发给目标对象,并接收目标对象发送的调用请求对应的返回值;
103:如果返回值不是可传输类型、并且返回值实现有一接口,转发器根据返回值构造可被远程访问的另一转发器,并创建另一转发器的桩Stub;
另外,如果返回值是可传输类型,转发器将返回值发送给客户端,使客户端将返回值返回给客户。
其中,可传输类型包括:基本类型、远程对象和可序列化对象。
104:转发器将另一转发器的Stub发送给客户端,使客户端根据另一转发器的Stub创建调用处理器,并根据调用处理器和返回值的接口构造并返回动态远程代理给客户。
参见图2,下面结合具体实例,详细介绍上述访问非远程对象的方法。
其中,步骤101-104中的转发器、另一调用处理器、另一动态远程代理、返回值、另一转发器、调用处理器、动态远程代理分别对应步骤200-209中的第一转发器、第一调用处理器、第一动态远程代理、第一返回值、第二转发器、第二调用处理器、第二动态远程代理。其中,第一和第二用于区分不同的对象,并不表示顺序关系。
200:服务器端的目标对象实现某一接口,该目标对象是非远程对象;
其中,目标对象的方法的返回值是面向对象语言的基本类型、远程对象或Serializable对象等能够通过网络传输的类型(简称可传输类型),或者不能通过网络传输的类型但实现了某一接口。另外,面向对象语言包括但不限于Java,其基本类型包括int,float,boolean等。
201:服务器端根据目标对象创建可被远程访问的第一转发器;
其中,第一转发器是“远程调用器”的一个具体实现、且“远程调用器”是一个可被远程访问的接口,因此,第一转发器也可以被远程访问。远程调用器”可被远程访问,具体可以通过继承远程接口实现,以Java为例,可以继承java.rmi.Remote接口实现可被远程访问。“远程调用器”包括一个调用方法,该调用方法的参数包括目标对象方法的标识和目标对象方法的参数。
其中,调用方法实现对目标对象某一方法的调用,以Java为例,该调用方法的签名为:public Object invoke(l0ng opnum,Object[]args)throws hrowable;参数opnum表示目标对象方法的标识,具体可以根据目标对象方法的签名构造出的字符串的SHA(Secure HashAlgorithm,安全散列算法)消息摘要,取其前64位而得到的一个long型值作为opnum,参数args为目标对象方法的参数。
202:服务器端创建第一转发器的Stub(桩),并将Stub放到公共的命名服务器上,该命名服务器可以被客户端访问;
其中,Stub是一种本地代理,用于代理远程主机上的远程对象,它与远程对象实现相同的接口,负责接收来自本地的方法调用,并在后台发起对远程对象的网络连接,完成实际的远程调用,调用完成后,把调用结果返回给本地客户。Stub都是Serializable对象,因此可以在网络上传输。其中,本地指客户端,远程主机指服务器,远程对象指目标对象,客户指客户端调用远程对象的程序。
203:客户端从命名服务器上获取第一转发器的Stub;
另外,客户端除了通过命名服务器获取第一转发器的Stub,还可以通过其他方法获取第一转发器的Stub,本实施例并不限定。
204:客户端根据第一转发器的Stub,创建客户端的第一调用处理器;
其中,第一调用处理器由于持有第一转发器的Stub,第一转发器是远程调用器的一个具体实现,因此,第一调用处理器可以发起对远程调用对象的调用。
205:客户端根据第一调用处理器和目标对象的接口,创建目标对象的第一动态远程代理;
其中,第一动态远程代理的生成过程为现有技术,这里不再赘述。
206:客户端根据目标对象的第一动态远程代理,发起对服务器端目标对象的调用;
具体的,客户端向服务器端的第一转发器发送调用请求,调用请求携带目标对象方法的标识和目标对象方法的参数。
207a:服务器端的第一转发器接收到客户端的调用请求后,将调用请求转发给实际的目标对象;
207b:目标对象根据调用请求,利用其参数执行相应的方法,并将方法的第一返回值发送给服务器端的第一转发器;
208:服务器端的第一转发器对第一返回值进行判断;具体的,
a)如果第一返回值不是可传输类型、并且第一返回值实现有一接口,根据第一返回值构造可被远程访问的第二转发器,并创建第二转发器的桩Stub,将第二转发器的Stub作为第二返回值携带在调用响应中返回给客户端;
其中,第二转发器及其Stub实现了可被远程访问的“远程调用器”。
其中,可传输类型包括:基本类型、远程对象和可序列化对象,相应的,不是可传输类型,也即不是基本类型、远程对象或可序列化对象。
b)如果不是以上情况,例如,第一返回值是基本类型、远程对象或可序列化对象等可传输类型,则不做处理,将第一返回值作为第二返回值携带在调用响应中直接返回给客户端。
209:客户端接收到服务端返回的调用响应后,根据其中携带的第二返回值进行相应处理;具体的,
a)针对208a),如果第二返回值实现了“远程调用器”,则利用步骤204和205的方法构造第二动态远程代理返回给客户,也即根据第二返回值创建第二调用处理器,根据第二调用处理器和第一返回值的接口,构造第二动态远程代理。
其中,第二动态远程代理实现了第二返回值所实现的接口,后续最终客户如果需要可以不重复步骤206-209的过程,可以直接执行第二动态远程代理中的方法,发起远程调用。
b)针对208b),如果第二返回值是可传输类型(也即未实现“远程调用器”),则直接返回给客户。
本实施例提供的方法,一方面通过在服务器端设置一个转发器作为目标对象的伴随对象,在客户端设置一个调用处理器与之相配合,该服务器端的转发器自动处理对目标对象方法调用的返回值,对于无法在网络上传输的返回值,构造新的转发器返回给客户端,该客户端的调用处理器对服务器的返回值进行判断处理,如果服务器返回的是另一转发器,则客户端根据另一转发器的Stub创建调用处理器,并根据调用处理器和返回值的接口构造并返回动态远程代理给客户,后续如果客户需要,可再执行动态远程代理中的方法发起远程调用,另外,如果服务器的返回值可以在网络上传输,则直接返回给客户,从而有效解决了非远程对象远程访问失败的问题。
另一方面,服务器端的转发器和客户端的另一远程调用处理器是两个现成组件,用户在对目标对象开始实施远程调用时,仅在开始分别在服务器端和客户端实例化这两个组件,即可进行调用,而后续若对返回对象再实施调用,则无需作任何额外的动作,因为转发器和远程调用处理器会自动再生成后续的返回对象的转发器和远程调用处理器,从而实现调用的简单化和自动化。
实施例2
参见图3,本实施例提供了一种访问非远程对象的装置,包括:
接收模块301,用于接收客户端发起的对目标对象的调用请求,目标对象是非远程对象;
收发模块302,用于将接收模块301接收的调用请求转发给目标对象,并接收目标对象发送的调用请求对应的返回值;
构造模块303,用于如果收发模块302接收的返回值不是可传输类型、并且返回值实现有一接口,根据返回值构造可被远程访问的另一转发器,并创建另一转发器的桩Stub;
发送模块304,用于将另一转发器的Stub发送给客户端,使客户端根据另一转发器的Stub创建调用处理器,并根据调用处理器和返回值的接口构造并返回动态远程代理给客户。
其中,调用请求是客户端获取转发器的Stub,根据转发器的Stub,创建另一调用处理器,根据另一调用处理器和目标对象的接口,构造另一动态远程代理,根据另一动态远程代理向转发器发起对目标对象的调用请求。
进一步的,参见图4,该装置还包括:
第二发送模块305,用于如果收发模块302接收的返回值是可传输类型,将返回值发送给客户端,使客户端将返回值返回给客户。
其中,构造模块303或第二发送模块305的可传输类型包括:基本类型、远程对象和可序列化对象。
本实施例提供的装置,可以是一转发器,与方法实施例中的第一转发器属于同一构思,其实现过程详见方法实施例,这里不再赘述。
本实施例提供的装置,通过将自身设置在服务器端作为目标对象的伴随对象,并与客户端设置的调用处理器配合,本装置自动处理对目标对象方法调用的返回值,对于无法在网络上传输的返回值,构造新的转发器返回给客户端,该客户端的调用处理器对服务器的返回值进行判断处理,如果服务器返回的是另一转发器,则客户端根据另一转发器的Stub创建调用处理器,并根据调用处理器和返回值的接口构造并返回动态远程代理给客户,后续如果客户需要,可再执行动态远程代理中的方法发起远程调用,另外,如果服务器的返回值可以在网络上传输,则直接返回给客户,从而有效解决了非远程对象远程访问失败的问题。
另一方面,本装置和客户端的另一远程调用处理器是两个现成组件,用户在对目标对象开始实施远程调用时,仅在开始分别在服务器端和客户端实例化这两个组件,即可进行调用,而后续若对返回对象再实施调用,则无需作任何额外的动作,因为本装置和远程调用处理器会自动再生成后续的返回对象的相应装置和远程调用处理器,从而实现调用的简单化和自动化。
以上实施例提供的技术方案中的全部或部分内容可以通过软件编程实现,其软件程序存储在可读取的存储介质中,存储介质例如:计算机中的硬盘、光盘或软盘。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。