进程间通信方法、装置、计算机设备及可读存储介质与流程

文档序号:18009251发布日期:2019-06-25 23:47阅读:132来源:国知局
进程间通信方法、装置、计算机设备及可读存储介质与流程

本申请涉及计算机技术领域,特别是涉及一种进程间通信方法、进程间通信装置、计算机设备和计算机可读存储介质。



背景技术:

在计算机技术领域,ipc(inter-processcommunication,进程间通信)指操作系统提供的,允许进程管理共享数据的机制。通过ipc机制,不同的进程之间可以互相访问资源并协调工作。

然后,传统的进程间通信机制的实现过程繁琐,效率低下。



技术实现要素:

基于此,有必要针对传统的进程间通信机制的实现过程繁琐,效率低下的问题,提供一种进程间通信方法、进程间通信装置、计算机可读存储介质和计算机设备。

一种进程间通信方法,包括:

接收进程间通信指令,通过调用服务绑定接口函数,向目标服务端进程发送调用服务绑定请求,建立与目标服务端进程之间的绑定连接,所述调用服务绑定请求携带客户端进程识别信息;

调用服务接口函数,通过所述绑定连接向所述目标进程发送调用服务请求,所述调用服务请求携带待调用方法信息;

接收所述目标服务端进程基于所述调用服务请求返回的操作返回值,所述操作返回值为所述目标服务端进程执行所述待调用方法信息对应的方法的操作,获得操作结果,并基于所述操作结果确定。

一些实施例中,接收进程间通信指令,通过调用服务绑定接口函数,向目标服务端进程发送调用服务绑定请求,建立与目标服务端进程之间的绑定连接,包括:

接收进程间通信指令,通过调用服务绑定接口函数,创建服务绑定接口函数实例;

通过服务绑定接口函数实例向目标服务端进程发送调用服务绑定请求,建立与目标服务端进程之间的绑定连接。

一些实施例中,还包括步骤:在所述服务绑定接口函数实例达到服务绑定接口函数实例生命周期时,回收所述服务绑定接口函数实例。

一些实施例中,还包括步骤:在所述服务绑定接口函数实例达到服务绑定接口函数实例生命周期时,还向目标服务端进程发送服务绑定接口函数实例回收通知。

一些实施例中,在建立与目标服务端进程之间的绑定连接之后,还包括步骤:接收并缓存目标服务端进程返回的连接成功的服务代理句柄;

上述调用服务请求携带所述服务代理句柄。

一些实施例中,还包括步骤:接收所述目标服务端进程返回的实参,通过所述实参进行函数回调。

一些实施例中,还包括步骤:在所述动态代理实例达到动态代理实例生命周期时,回收所述动态代理实例。

一种进程间通信方法,包括:

接收调用服务绑定请求,调用服务绑定请求携带客户端进程识别信息,通过服务绑定接口函数建立与客户端进程之间的绑定连接,所述客户端进程与所述客户端进程识别信息对应;

接收调用服务请求,所述调用服务请求携带待调用方法信息;

通过服务接口函数,执行所述待调用方法信息对应的方法的操作,获得操作结果,并基于所述操作结果向所述客户端进程返回操作返回值。

一些实施例中,通过服务绑定接口函数建立与客户端进程之间的绑定连接之后,还包括步骤:

向所述客户端进程返回服务代理句柄;

上述调用服务请求携带所述服务代理句柄。

一些实施例中,还包括步骤:通过动态代理进行回调,并通过动态代理将实参返回给所述客户端进程。

一些实施例中,还包括步骤:在接收到所述客户端进程发送的动态代理实例回收通知时,回收缓存的动态代理实例。

一种进程间通信装置,包括:

客户端绑定模块,用于接收进程间通信指令,通过调用服务绑定接口函数,向目标服务端进程发送调用服务绑定请求,建立与目标服务端进程之间的绑定连接,所述调用服务绑定请求携带客户端进程识别信息;

方法调用模块,用于调用服务接口函数,通过所述绑定连接向所述目标进程发送调用服务请求,所述调用服务请求携带待调用方法信息;

结果接收模块,用于接收所述目标服务端进程基于所述调用服务请求返回的操作返回值,所述操作返回值为所述目标服务端进程执行所述待调用方法信息对应的方法的操作,获得操作结果,并基于所述操作结果确定。

一些实施例中,客户端绑定模块,接收进程间通信指令,通过调用服务绑定接口函数,创建服务绑定接口函数实例;通过服务绑定接口函数实例向目标服务端进程发送调用服务绑定请求,建立与目标服务端进程之间的绑定连接。

一些实施例中,客户端绑定模块,在所述服务绑定接口函数实例达到服务绑定接口函数实例生命周期时,回收所述服务绑定接口函数实例。

一些实施例中,客户端绑定模块,还在建立与目标服务端进程之间的绑定连接之后,接收并缓存目标服务端进程返回的连接成功的服务代理句柄;

上述调用服务请求携带所述服务代理句柄。

一些实施例中,方法调用模块,在所述服务接口函数为单例模式时,执行所述服务接口函数,向所述目标进程发送调用服务请求。

一些实施例中,方法调用模块,在接收到实例创建指令时,调用服务接口函数,创建动态代理实例;通过所述远程代理实例向所述目标进程发送调用服务请求。

一些实施例中,方法调用模块,包括:

动态代理确定模块,用于调用服务接口函数,确定当前调用的动态代理类;

序列化模块,用于对待传输参数进行序列化,获得序列化后参数;

封装模块,用于封装所述当前调用的动态代理类的待调用方法信息,获得封装后的所述待调用方法信息,所述待调用方法信息包括:所述待调用方法的识别信息、所述序列化后参数以及所述操作返回值;

请求发送模块,用于向所述目标进程发送调用服务请求,所述调用服务请求携带封装后的所述待调用方法信息。

一些实施例中,序列化模块在所述待传输参数为第一类型参数时,逐一对所述待传输参数的变量进行递归序列化,获得序列化后参数。

一些实施例中,序列化模块在所述待传输参数为第二类型参数时,复用预定序列化方式,对所述待传输参数进行序列化,获得序列化后参数。

一些实施例中,序列化模块在所述待传输参数为第三类型参数时,对所述待传输参数的内部变量逐一检查后,对各内部变量进行序列化,获得序列化后参数。

一些实施例中,序列化模块在所述待传输参数为第四类型参数时,将类名作为序列化后参数。

一些实施例中,方法调用模块,还在所述动态代理实例达到动态代理实例生命周期时,回收所述动态代理实例。

一种进程间通信装置,包括:

服务端绑定模块,用于接收调用服务绑定请求,调用服务绑定请求携带客户端进程识别信息,通过服务绑定接口函数建立与客户端进程之间的绑定连接,所述客户端进程与所述客户端进程识别信息对应;

方法调用接收模块,用于接收调用服务请求,所述调用服务请求携带待调用方法信息;

方法执行模块,通过服务接口函数,执行所述待调用方法信息对应的方法的操作,获得操作结果,并基于所述操作结果向所述客户端进程返回操作返回值。

一些实施例中,服务端绑定模块,还在通过服务绑定接口函数建立与客户端进程之间的绑定连接之后,向所述客户端进程返回服务代理句柄;

上述调用服务请求携带所述服务代理句柄。

一些实施例中,方法执行模块,包括:

解析模块,用于通过服务接口函数,解析所述待调用方法信息,获得当前调用的动态代理实例、待调用方法的识别信息以及序列化后参数;

反序列化模块,用于对所述序列化参数进行反序列化操作,获得反序列化后参数;

执行模块,用于通过所述动态代理类以及所述反序列化后参数,执行所述待调用方法的识别信息对应的方法,获得操作结果。

一些实施例中,方法执行模块,通过动态代理进行回调,并通过动态代理将实参返回给所述客户端进程。

一些实施例中,方法执行模块,在接收到所述客户端进程发送的动态代理实例回收通知时,回收缓存的动态代理实例。

一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,其中,所述计算机程序被所述处理器执行时,实现如上所述的任意一项所述的进程间通信的方法的步骤。

一种计算机可读存储介质,其上存储有计算机程序,其中,所述计算机程序被处理器执行时实现如上所述的任意一项所述的进程间通信的方法的步骤。

上述进程间通信方法、进程间通信装置、计算机可读存储介质和计算机设备,通过封装服务端的绑定服务的过程以及服务的执行过程,在需要进行进程间通信时,客户端进程通过调用服务绑定接口函数即可便捷简单的实现与目标服务端进程之间的绑定连接,通过调用服务接口函数即可实现服务端进程所执行的方法的调用,简单便捷,简化了进程间通信的实现过程,提高了客户端进程的开发效率,提高了进程间通信的效率。

附图说明

图1为一个实施例中的进程通信的应用环境图;

图2为另一个实施例中的进程通信的应用环境图;

图3为一个实施例的进程间通信过程方法的流程示意图;

图4为一个实施例中的进程间通信方法的流程示意图;

图5为一个实施例的进程间通信过程中进程间连接的原理示意图;

图6为一个实施例的进程间通信过程中调用动态代理实例的原理示意图;

图7为一个实施例的进程间通信过程中数据封装和序列化的原理示意图;

图8为一个实施例的进程间通信过程中回调的原理示意图;

图9为一个实施例的进程间通信过程中回收实例的原理示意图;

图10为一个实施例的进程间通信装置的结构框图;

图11为一个示例中的方法调用模块的结构框图;

图12为另一个实施例的进程间通信装置的结构框图;

图13为一个示例中的方法执行模块的结构框图;

图14为一个实施例中计算机设备的结构框图;

图15为一个实施例中计算机设备的结构框图。

具体实施方式

为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。

本申请实施例提及的进程间通信的方案,两个进程间进行通信的应用场景。其中,这两个进程可以是位于同一个设备内,即是同一个设备内的两个进程之间进行通信,如图1所示,其中,这里的设备a可以是用户终端设备,也可以是服务器设备。另外,这两个进程也可以是位于不同的设备,即两个不同设备之间的进程间的通信,其中,这里的两个设备,可以均是用户终端设备,也可以是均是服务器设备,也可以是一个设备为用户终端设备,而另一个设备为服务器设备。图1、图2所示中,server进程指提供服务的进程,本申请实施例中也称为服务端进程,client进程指访问服务的进程,本申请实施例中也称为客户端进程。

以两个进程位于同一设备a为例,该设备a的操作系统类型可以是android系统(安卓系统),下述相关实施例的说明中,是以将本申请的进程间通信方法应用于android系统为例进行说明。

参考图3,一个实施例中的进程间通信的方法,包括下述步骤s301至步骤s303,该方法可以由客户端进程执行。

步骤s301:接收进程间通信指令,通过调用服务绑定接口函数,向目标服务端进程发送调用服务绑定请求,建立与目标服务端进程之间的绑定连接,所述调用服务绑定请求携带客户端进程识别信息。

其中,上述客户端进程识别信息是用以识别客户端进程的信息,客户端进程识别信息的形式不限,在一些实施例中,该客户端进程识别信息可以是客户端进程的名称,在一些实施例中,在为客户端进程进行编号的情况下,该客户端进程识别信息也可以是客户端进程的编号,在其他实施例中,该客户端进程识别信息也可以是其他形式的信息,只要能够唯一识别客户端进程即可。

其中,在执行进程间通信方法之前,先对客户端绑定服务(bindserver)的过程进行封装,封装后得到的服务绑定接口函数可在系统平台进行注册,以供各客户端进行调用。其中,在存在不同的绑定服务的方式的情况下,可以对多个不同的绑定服务的方式分别进行封装,从而可以有多个不同的服务绑定接口函数。可以理解,在实际进程间通信的过程中,该服务绑定函数已经封装并注册在系统平台,直接调用该服务绑定接口函数来完成该绑定服务的过程即可。

一些实施例中,客户端进程可以在任何需要进行进程间通信时接收到该进程间通信指令。该进程间通信指令,可以是由客户端进程所在设备的用户通过与设备的交互操作发出,也可以是由客户端进程所在设备的其他处理逻辑在满足进程间通信条件时发出,本申请方案不对进程间通信的触发场景进行限定。

一些实施例中,通过调用服务绑定接口函数,向目标服务端进程发送调用服务绑定请求,建立与目标服务端进程之间的绑定连接,具体可以包括:

通过调用服务绑定接口函数,创建服务绑定接口函数实例;其中,可以采用任何可能的方式创建该服务绑定接口函数实例;

通过服务绑定接口函数实例建立与目标服务端进程之间的绑定连接。

一些实施例中,通过服务绑定接口函数实例建立与目标服务端进程之间的绑定连接,具体可以包括:

通过服务绑定接口函数实例,向目标服务端进程发送调用服务绑定请求,以指示目标服务端进程执行服务绑定接口函数对应的方法,以建立绑定连接。

一些实施例中,针对上述创建的服务绑定接口函数实例,还可以设置有对应的服务绑定接口函数实例生命周期,该服务绑定接口函数实例生命周期可以采用任何可能的方式设定,其可以是固定值,也可以是基于该服务绑定接口函数实例的进程间通信的过程确定。此时,在所述服务绑定接口函数实例达到服务绑定接口函数实例生命周期时,回收所述服务绑定接口函数实例。

一些实施例中,在所述服务绑定接口函数实例达到服务绑定接口函数实例生命周期时,还可以向上述目标服务端进程发送服务绑定接口函数实例回收通知,以通知目标服务端进程回收缓存的服务绑定接口函数实例,避免服务绑定接口函数实例的无序增长。

一些实施例中,在建立与目标服务端进程之间的绑定连接之后,还包括步骤:接收并缓存目标服务端进程返回的连接成功的服务代理句柄。

步骤s302:调用服务接口函数,通过所述绑定连接向所述目标进程发送调用服务请求,所述调用服务请求携带待调用方法信息。

其中,在执行进程间通信方法之前,先对各服务端进程提供的服务(service)进行封装,例如可以封装服务的定义,封装后得到的服务接口函数可在系统平台进行注册,以供各客户端在进行进程间通信的过程中调用,同时可在相关的配置文件中声明各服务接口函数以及各服务接口函数所使用到的服务端进程。其中,可以对多个不同的服务进行封装,从而获得多个不同的服务接口函数。可以理解,在实际进程间通信的过程中,该服务接口函数已经封装并注册在系统平台,直接调用该服务接口函数来完成方法执行的过程即可。

一些实施例中,调用服务接口函数,通过所述绑定连接向所述目标服务端进程发送调用服务请求,包括:在所述服务接口函数为单例模式时,执行所述服务接口函数,向所述目标进程发送调用服务请求。此时,在单例模式下,一个类只有一个实例,此时,可以直接执行所述服务接口函数,向所述目标进程发送调用服务请求。

一些实施例中,调用服务接口函数,通过所述绑定连接向所述目标服务端进程发送调用服务请求,包括:在接收到实例创建指令时,调用服务接口函数,创建动态代理实例;通过所述动态代理实例向所述目标进程发送调用服务请求。此时,在非单例模式下,针对一个类可以创建多个不同的实例,此时,可以基于服务接口函数创建动态代理实例之后,通过远程代理实例发送调用服务请求。

一些实施例中,调用服务接口函数,通过所述绑定连接向所述目标服务端进程发送调用服务请求,包括下述步骤s3021至步骤s3034。

步骤s3021:调用服务接口函数,确定当前调用的动态代理类。其中,在所述服务接口函数为单例模式时,可以直接该服务接口函数的单例确定动态代理类。在所述服务接口函数不是单例模式时,可以通过创建动态代理实例确定调用的动态代理类。可以理解,在其他实施例中,也可以采用其他的方式确定该动态代理类。

一些实施例中,针对上述创建的动态代理实例,还可以设置有对应的动态代理实例生命周期,该动态代理实例生命周期可以采用任何可能的方式设定,其可以是固定值,也可以是基于该动态代理实例的方法调用过程确定。此时,在所述动态代理实例达到动态代理实例生命周期时,还回收所述动态代理实例。

一些实施例中,在所述动态代理实例达到动态代理实例生命周期时,还向上述目标服务端进程发送动态代理实例回收通知,以通知目标服务端进程回收缓存的动态代理实例,避免动态代理实例的无序增长。

步骤s3022:对待传输参数进行序列化,获得序列化后参数。

可以理解,对于同一个或者不同的客户端进程,在与不同的服务端进程进行进程间通信时,在需要调用的服务接口函数不同的情况下,需要序列化的参数待传输参数的数量和类型可能并不相同,本申请实施例不做具体限定。

一些实施例中,对待传输参数进行序列化,获得序列化后参数,具体可以包括如下过程。

当待传输参数为第一类型参数时,逐一对所述待传输参数的变量进行递归序列化,获得序列化后参数。一些实施例中,该第一类型参数可以是类型为普通类型的参数,哪些类型可以是普通类型可以结合实际技术需要设定。

当所述待传输参数为第二类型参数时,复用预定序列化方式,对所述待传输参数进行序列化,获得序列化后参数。一些实施例中,该第二类型参数可以是parcelable类型或者primitive类型的参数。此时,上述复用的预定序列化方式,可以是系统parcel序列化方式。parcel序列化,可以将对对象序列化之后的字节流数据写入到一个共享内存中,其他进程通过parcel可以从这块共享内存中读出字节流数据,并反序列化成对象。

当所述待传输参数为第三类型参数时,对所述待传输参数的内部变量逐一检查后,对各内部变量进行序列化,获得序列化后参数。一些实施例中,该第三类型参数可以是非parcelable的reference类型的参数。

当所述待传输参数为第四类型参数时,将类名作为序列化后参数。一些实施例中,该第四类型参数,可以是特殊类型context类型的参数。这里的类名可以是上述确定的动态代理类的类名。

步骤s3023:封装所述当前调用的动态代理类的待调用方法信息进行封装,所述待调用方法信息包括:所述待调用方法的识别信息、所述序列化后参数以及所述操作返回值。

具体对待调用方法信息进行封装的方式,可以采用任何可能的对数据进行封装的方式进行,本申请实施例不做具体限定。

步骤s3024:向所述目标服务端进程发送调用服务请求,所述调用服务请求携带封装后的所述待调用方法信息。

可以理解,在向所述目标服务端进程发送调用服务请求时,是基于调用的服务接口函数向目标服务端进程发送给调用服务请求。

可以理解,在上述接收并缓存目标服务端进程返回的连接成功的服务代理句柄的情况下,上述调用服务请求还可以携带所述服务代理句柄。

步骤s303:接收所述目标服务端进程基于所述调用服务请求返回的操作返回值,所述操作返回值为所述目标服务端进程执行所述待调用方法信息对应的方法的操作,获得操作结果,并基于所述操作结果确定。

一些实施例中,该操作返回值可以携带在上述向目标服务端进程发送的调用服务请求中,也可以是在系统中约定。

一些实施例中,在上述执行进程间通信的过程中,可以通过接收所述目标服务端进程返回的实参,并通过所述实参调用回调函数。一些实施例中,这里的实参可以采用任何可能的方式确定。例如,可以是上述返回的服务代理句柄。

参考图4,一个实施例中的进程间通信的方法,包括下述步骤s401至步骤s403,该方法可以由服务端进程执行。

步骤s401:接收调用服务绑定请求,调用服务绑定请求携带客户端进程识别信息,通过服务绑定接口函数建立与客户端进程之间的绑定连接,所述客户端进程与所述客户端进程识别信息对应。

其中,如图3对应的进程间通信的方法的实施例中类型,上述客户端进程识别信息是用以识别客户端进程的信息,客户端进程识别信息的形式不限,在执行进程间通信方法之前,先对客户端绑定服务(bindserver)的过程进行封装,封装后得到的服务绑定接口函数可在系统平台进行注册,以供各客户端进行调用。

一些实施例中,该调用服务绑定请求,可以是由客户端进程通过调用服务绑定接口函数,创建服务绑定接口函数实例之后,通过创建的服务绑定接口函数实例发出该调用服务绑定请求。此时,在接收到该调用服务绑定请求之后,可以将该服务绑定接口函数实例进行缓存。据此,一些实施例中,还可以接收客户端进程发送的服务绑定接口函数实例回收通知,并基于该服务绑定接口函数实例回收通知,回收缓存的服务绑定接口函数实例,以避免服务绑定接口函数实例的无序增长。

一些实施例中,在建立与目标服务端进程之间的绑定连接之后,还包括步骤:向所述客户端进程返回服务代理句柄。

步骤s402:接收调用服务请求,所述调用服务请求携带待调用方法信息。

一些实施例中,该调用服务请求携带的待调用方法信息,可以是客户端进程进行序列化及封装之后得到的待调用方法信息。

可以理解,在上述返回了服务代理句柄的情况下,上述调用服务请求还可以携带所述服务代理句柄。

一些实施例中,该调用服务请求,可以是由客户端进程通过调用服务接口函数,创建动态代理实例之后,通过动态代理实例发出该调用服务请求。此时,在接收到该调用服务请求之后,可以将该动态代理实例进行缓存。据此,一些实施例中,还可以在接收到所述客户端进程发送的动态代理实例回收通知时,回收缓存的动态代理实例,以避免动态代理实例的无序增长。

步骤s403:通过服务接口函数,执行所述待调用方法信息对应的方法的操作,获得操作结果,并基于所述操作结果向所述客户端进程返回操作返回值。

一些实施例中,通过服务接口函数,执行所述待调用方法信息对应的方法的操作,获得操作结果,包括下述步骤s4031至步骤s4033。

步骤s4031:通过服务接口函数,解析所述待调用方法信息,获得当前调用的动态代理实例、待调用方法的识别信息以及序列化后参数。

步骤s4032:对所述序列化后参数进行反序列化操作,获得反序列化后参数。

其中,在进行反序列化操作时,基于客户端进程进行序列化的方式,可以采用与序列化方式对应的反序列化方式进行。一些实施例中,可以通过识别序列化后参数的参数类型,以采用对应的反序列化方式。在一些实施例中,在序列化后参数中可以携带有参数类型标识,可以通过该参数类型标识采用对应的反序列化方式。在一些实施例中,可以通过封装统一的序列化和反序列化接口函数,在序列化和反序列化时均通过调用该统一的序列化和反序列化接口函数,来完成序列化和反序列化的过程。

步骤s4033:通过所述动态代理类以及所述反序列化后参数,执行所述待调用方法的识别信息对应的方法,获得操作结果,并基于所述操作结果向所述客户端进程返回操作返回值。

一些实施例中,基于所述操作结果向所述客户端进程返回操作返回值,可以是在操作结果为方法执行成功时,返回该操作返回值。该操作返回值可以携带在上述向目标服务端进程发送的调用服务请求中,也可以是在系统中约定。

一些实施例中,在上述执行进程间通信的过程中,可以通过动态代理进行回调,并通过动态代理将实参返回给所述客户端进程。这里的实参可以采用任何可能的方式确定。例如,可以是上述返回的服务代理句柄。

基于如上所述的实施例,以下结合本申请方案的一个具体应用示例进行详细说明。

为了使进程间通信(ipc)能够像普通的方法调用一样方便,本申请方案对客户端绑定服务(clientbindserver)的过程进行了封装,得到服务绑定接口函数。此外也对各服务端进程提供的服务(service)进行封装,例如可以封装服务的定义,得到服务接口函数。具体对clientbindserver和service的定义进行封装的方式不限。封装后得到的服务绑定接口函数以及服务接口函数在系统平台进行注册。

针对封装后得到的服务绑定接口函数以及服务接口函数,还可以在相关的配置文件中进行声明。例如,针对封装后得到的服务接口函数(例如封装的service的定义),可以在manifest(androidmanifest.xml配置文件的根元素)中声明使用到的该services以及其运行的进程。其中,在声明时,可以是声明上述所有封装了的service的服务接口函数。其中封装的service中,提供有remote方法,remot方法用以实现进程间通信的动态代理。

在执行上述封装及注册之后,在实际的进程间通信的过程中,即可通过调用上述服务绑定接口函数以及服务接口函数,来完成进程间通信的过程。

在进程间通信的过程中,客户端进程(client进程)在接收到进程间通信指令时,通过调用服务绑定接口函数,向目标服务端进程发送调用服务绑定请求。

参考图5所示,client进程接收到进程间通信指令时,通过client进程的进程间通信引擎(ipc引擎)通过调用服务绑定接口函数发出调用服务绑定请求,服务端进程(server进程)的进程间通信引擎(ipc引擎)接收到调用服务绑定请求,执行该服务绑定接口函数,建立client进程与server进程之间的绑定连接,其中,该server进程执行的方法(service)在该server进程执行。在建立client进程与server进程之间成功的绑定连接之后,server进程生成服务代理句柄(service代理句柄),并将该服务代理句柄返回给client进程,以便于后续的以便后续的进程间通信以及实例回收。其中,图5所示中的ipc引擎,涉及client进程的引擎与server进程的引擎。

其中,同一个client进程可以通过调用服务绑定接口函数,与多个不同的server进程绑定连接。一个server可以只执行一个service,也可以执行多个不同的service。可以理解,不同的service可以有对应的不同服务接口函数。其中,不同的server进程的不同service,可以有不同的service代理句柄,根据不同的service代理句柄,可以访问不同的service服务。

参考图6所示,在客户端进程与服务端进程成功绑定服务之后,在单例模式下,客户端进程发出动态代理请求,客户端进程的ipc引擎接收到该动态代理请求后,确定服务接口函数的动态代理类(remoteclass)的动态代理实例,通过动态代理实例序列化待传输参数,对待调用方法的识别信息、序列化后参数以及操作返回值进行封装后,向目标服务端进程发送调用服务请求。

参考图6所示,在客户端进程与服务端进程成功绑定服务之后,在非单例模式下,客户端进程发出动态代理请求,客户端进程的ipc引擎接收到该动态代理请求后,首先进行实例化操作,通过调用服务接口函数创建动态代理实例,然后通过动态代理实例序列化待传输参数,对待调用方法的识别信息、序列化后参数以及操作返回值进行封装后,向目标服务端进程发送调用服务请求。其中,图6所示中的ipc引擎,涉及client进程的引擎与server进程的引擎。

参考图7所示,在进行数据封装和序列化时,以待传输参数为parcelable类型为例,可以通过系统parcel序列化方式,对所述待传输参数进行序列化,获得序列化后参数。在该过程中,client进程的动态代理实例通过parcel序列化确定出ipc包,ipc包具体可以包括ipc方法信息以及ipc参数,ipc方法信息包括方法名称、方法的方法类、方法的段落类,ipc参数包括类名以及对应数据,通过序列化操作确定的ipc包还可以包括其他的属性以及相关类。完成序列化后,可将序列化后得到ipc包写入parcelutil包内的容器,该parcelutil包内的容器包括有指定的parcel内容部分以及系统指定的parcel内容部分。其中,一些实施例中,在该容器中,任何一个序列化后的参数对象都可以包括:类名、为parcelable类型(parcelable)、不是parcelable类型(n-parcelable)、primitive类型(primitive)以及其他相关类型的内容,在确定不是parcelable类型(n-parcelable)时,还可以进一步包括类名等相关类型的内容。

服务端进程的ipc引擎接收到该调用服务请求之后,解析所述待调用方法信息,获得当前调用的动态代理实例、待调用方法的识别信息以及序列化后参数,并进行对所述序列化后参数进行反序列化操作,获得反序列化后参数。参考图7所示,在通过系统parcel序列化方式进行序列化的情况下,服务端进程的ipc引擎可以从parcelutil包内的容器读取相关待调用方法信息。

在单例模式下,可以直接基于反序列化后参数执行待调用方法的识别信息的方法,获得操作结果。在非单例模式下,可以通过所述动态代理类以及所述反序列化后参数,执行待调用方法的识别信息的方法,获得操作结果。在执行结束且执行结果为成功时,存储解析出的操作返回值returnvalue,并将该操作返回值returnvalue返回给client进程。

其中,在上述进程间通信过程中,通过回调函数(callback函数)来实现函数之间的调用。callback(回调函数)是一个通过函数指针调用的函数。如果把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,即称这个函数是一个回调函数。

具体在本申请方案中,参考图8所示,进程间通信引擎可提供一个公共回调函数,server进程端可以通过如上所述的动态代理实例进行回调,动态代理实例可以通过公共回调将实参返回到client进程。而client进程再通过接收到的实参去调用真实的callback,该真是的回调函数预缓存在client进程端)。

其中,如上所述,在上述进程间通信过程中,参考图9所示,server进程可缓存动态代理实例(remoteinstance)。为了避免server进程端的动态代理实例的无序增长,需要对remote实例进行回收。可以采用各种可能的方式对动态代理实例进行回收。具体在本申请方案中,由client进程设置动态代理实例的生命周期,client进程在动态代理实例的生命周期结束时,对动态代理实例进行回收。在具体示例中,client进程通过虚引用(phantomreference)和referencequeue跟踪动态代理实例的回收情况,如果动态代理实例被回收,则向server进程发送动态代理实例回收通知,通知server进程回收动态代理实例。server进程接收到通知动态代理实例回收通知时,回收缓存的动态代理实例。

参考图10所示,一个实施例中的进程间通信装置,包括:

客户端绑定模块101,用于接收进程间通信指令,通过调用服务绑定接口函数,向目标服务端进程发送调用服务绑定请求,建立与目标服务端进程之间的绑定连接,所述调用服务绑定请求携带客户端进程识别信息;

方法调用模块102,用于调用服务接口函数,通过所述绑定连接向所述目标进程发送调用服务请求,所述调用服务请求携带待调用方法信息;

结果接收模块103,用于接收所述目标服务端进程基于所述调用服务请求返回的操作返回值,所述操作返回值为所述目标服务端进程执行所述待调用方法信息对应的方法的操作,获得操作结果,并基于所述操作结果确定。

一些实施例中,客户端绑定模块101,接收进程间通信指令,通过调用服务绑定接口函数,创建服务绑定接口函数实例;通过服务绑定接口函数实例向目标服务端进程发送调用服务绑定请求,建立与目标服务端进程之间的绑定连接。

一些实施例中,客户端绑定模块101,在所述服务绑定接口函数实例达到服务绑定接口函数实例生命周期时,回收所述服务绑定接口函数实例。

一些实施例中,客户端绑定模块101,还在建立与目标服务端进程之间的绑定连接之后,接收并缓存目标服务端进程返回的连接成功的服务代理句柄;

上述调用服务请求携带所述服务代理句柄。

一些实施例中,方法调用模块102,在所述服务接口函数为单例模式时,执行所述服务接口函数,向所述目标进程发送调用服务请求。

一些实施例中,方法调用模块102,在接收到实例创建指令时,调用服务接口函数,创建动态代理实例;通过所述远程代理实例向所述目标进程发送调用服务请求。

一些实施例中,方法调用模块102,包括:

动态代理确定模块1021,用于调用服务接口函数,确定当前调用的动态代理类;

序列化模块1022,用于对待传输参数进行序列化,获得序列化后参数;

封装模块1023,用于封装所述当前调用的动态代理类的待调用方法信息,获得封装后的所述待调用方法信息,所述待调用方法信息包括:所述待调用方法的识别信息、所述序列化后参数以及所述操作返回值;

请求发送模块1024,用于向所述目标进程发送调用服务请求,所述调用服务请求携带封装后的所述待调用方法信息。

一些实施例中,序列化模块1022在所述待传输参数为第一类型参数时,逐一对所述待传输参数的变量进行递归序列化,获得序列化后参数。

一些实施例中,序列化模块1022在所述待传输参数为第二类型参数时,复用预定序列化方式,对所述待传输参数进行序列化,获得序列化后参数。

一些实施例中,序列化模块1022在所述待传输参数为第三类型参数时,对所述待传输参数的内部变量逐一检查后,对各内部变量进行序列化,获得序列化后参数。

一些实施例中,序列化模块1022在所述待传输参数为第四类型参数时,将类名作为序列化后参数。

一些实施例中,方法调用模块102,还在所述动态代理实例达到动态代理实例生命周期时,回收所述动态代理实例。

参考图12所示,一种进程间通信装置,包括:

服务端绑定模块121,用于接收调用服务绑定请求,调用服务绑定请求携带客户端进程识别信息,通过服务绑定接口函数建立与客户端进程之间的绑定连接,所述客户端进程与所述客户端进程识别信息对应;

方法调用接收模块122,用于接收调用服务请求,所述调用服务请求携带待调用方法信息;

方法执行模块123,通过服务接口函数,执行所述待调用方法信息对应的方法的操作,获得操作结果,并基于所述操作结果向所述客户端进程返回操作返回值。

一些实施例中,服务端绑定模块121,还在通过服务绑定接口函数建立与客户端进程之间的绑定连接之后,向所述客户端进程返回服务代理句柄;

上述调用服务请求携带所述服务代理句柄。

一些实施例中,方法执行模块123,包括:

解析模块1231,用于通过服务接口函数,解析所述待调用方法信息,获得当前调用的动态代理实例、待调用方法的识别信息以及序列化后参数;

反序列化模块1232,用于对所述序列化参数进行反序列化操作,获得反序列化后参数;

执行模块1233,用于通过所述动态代理类以及所述反序列化后参数,执行所述待调用方法的识别信息对应的方法,获得操作结果。

一些实施例中,方法执行模块123,通过动态代理进行回调,并通过动态代理将实参返回给所述客户端进程。

一些实施例中,方法执行模块123,在接收到所述客户端进程发送的动态代理实例回收通知时,回收缓存的动态代理实例。

可以理解,基于实际应用场景的不同,上述图10以及图12所示的进程间通信装置,可以做不同的设置。在一些进程固定为其他进行提供服务的情况下,该进程可以设置有图12所示的进程间通信装置,在一些进程固定只使用其他进程的服务的情况下,该进程中可设置有图10所示的进程间通信装置。在一些进程既可以请求其他进程的服务,又可以为其他进程提供服务的情况下,则可以同时设置有图10和图12所示的进程间通信装置。

图14示出了一个实施例中计算机设备的内部结构图。该计算机设备具体可以是图2中的服务器。如图14所示,该计算机设备包括该计算机设备包括通过系统总线连接的处理器、存储器和网络接口。其中,存储器包括非易失性存储介质和内存储器。该计算机设备的非易失性存储介质存储有操作系统,还可存储有计算机程序,该计算机程序被处理器执行时,可使得处理器实现进程间通信方法。该内存储器中也可储存有计算机程序,该计算机程序被处理器执行时,可使得处理器执行信息推送方法。

本领域技术人员可以理解,图14中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。

在一个实施例中,本申请提供的进程间通信装置100可以实现为一种计算机程序的形式,计算机程序可在如图14所示的计算机设备上运行。计算机设备的存储器中可存储组成该进程间通信装置的各个程序模块,各个程序模块构成的计算机程序使得处理器执行本说明书中描述的本申请各个实施例的进程间通信方法中的步骤。

图15示出了另一个实施例中计算机设备的内部结构图。该计算机设备具体可以是图1中的终端。如图15所示,该计算机设备包括该计算机设备包括通过系统总线连接的处理器、存储器、网络接口、输入装置和显示屏。其中,存储器包括非易失性存储介质和内存储器。该计算机设备的非易失性存储介质存储有操作系统,还可存储有计算机程序,该计算机程序被处理器执行时,可使得处理器实现进程间通信方法。该内存储器中也可储存有计算机程序,该计算机程序被处理器执行时,可使得处理器执行进程间通信方法。计算机设备的显示屏可以是液晶显示屏或者电子墨水显示屏,计算机设备的输入装置可以是显示屏上覆盖的触摸层,也可以是计算机设备外壳上设置的按键、轨迹球或触控板,还可以是外接的键盘、触控板或鼠标等。

本领域技术人员可以理解,图15中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。

在一个实施例中,本申请提供的进程间通信装置120可以实现为一种计算机程序的形式,计算机程序可在如图15所示的计算机设备上运行。计算机设备的存储器中可存储组成该进程间通信装置120的各个程序模块。各个程序模块构成的计算机程序使得处理器执行本说明书中描述的本申请各个实施例的进程间通信方法中的步骤。

据此,在一个实施例中,提供了一种计算机设备,包括存储器和处理器,存储器存储有计算机程序,计算机程序被处理器执行时,使得处理器执行上述进程间通信方法的步骤。此处的进程间通信方法的步骤可以是上述各个实施例的进程间通信方法中的步骤。

本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一非易失性计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可包括只读存储器(rom)、可编程rom(prom)、电可编程rom(eprom)、电可擦除可编程rom(eeprom)或闪存。易失性存储器可包括随机存取存储器(ram)或者外部高速缓冲存储器。作为说明而非局限,ram以多种形式可得,诸如静态ram(sram)、动态ram(dram)、同步dram(sdram)、双数据率sdram(ddrsdram)、增强型sdram(esdram)、同步链路(synchlink)dram(sldram)、存储器总线(rambus)直接ram(rdram)、直接存储器总线动态ram(drdram)、以及存储器总线动态ram(rdram)等。

因此,在一个实施例中,提供了一种计算机可读存储介质,存储有计算机程序,计算机程序被处理器执行时,使得处理器执行上述进程间通信方法的步骤。此处的进程间通信方法的步骤可以是上述各个实施例的进程间通信方法中的步骤。

以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。

以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本申请专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请专利的保护范围应以所附权利要求为准。

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