Corba系统中的java远程调用方法

文档序号:6585569阅读:104来源:国知局
专利名称:Corba系统中的java远程调用方法
技术领域
本发明涉及JAVA技术领域,特别涉及CORBA系统中的JAVA远程调用方法。
背景技术
CORBA (通用对象代理体系结构,Common Object Request BrokerArchitecture) 是对象管理组织(OMG)为解决分布式处理环境(DCE)中,硬件和软件系统的互连而提出的 一种解决方案。具有模型完整、先进,独立于系统平台和开发语言,被支持程度广泛的特点。 目前,绝大多数分布计算平台厂商都支持和遵循CORBA规范。COBRA系统,主要分为3个模 块对象请求代理模块、公共对象服务模块和公共设施模块。最底层是对象请求代理(ORB) 模块,用于实现对象间的通讯和互操作,在ORB模块之上为公共服务模块,可以提供诸如并 发服务、名字服务、事务服务、交易服务、安全服务等具体应用服务;最上层的公共设施模块 则用于提供可直接为业务对象使用的服务,规定业务对象有效协作所需的协议规则。CORBA 允许不同应用之间相互通信,而不管它们存在于哪里以及是谁设计的。其中ORB模块是在 调用对象之间建立Client/Server关系的中间件,是实现不同应用之间互相通信的关键。 通过ORB模块,客户可以透明地调用一个服务对象上的方法,这个服务对象可以在本地,也 可以在通过网络连接的其他机器上。ORB模块截获这一调用,同时负责查找实现服务的对象 并向其传递参数、调用方法返回最终结果。客户并不知道服务对象位于什么地方,它的编程 语言和操作系统是什么,也不知道不属于对象接口的其他系统部分。这样,ORB模块在异构 分布环境下为不同机器上的应用提供了互操作性,并无缝地集成了多种对象系统。ORB模块采用使用接口定义语言(IDL)实现,而IDL是独立于其他语言的,这使 ORB可以适用于采用不同的编程语言实现的模块和组件。更重要的是,ORB允许通过创建 IDL对不支持CORBA的老旧系统进行建模,将老旧系统进行包装,从而与老旧系统接口之间 传递信息。CORBA系统可以实现客户端通过网络从服务器端远程调用服务器端提供的服务实 现客户端本地的操作,例如集成在客户端设备中的CORBA客户端将客户端的指令和数据等 通过客户端ORB的包装发送给集成在服务器端设备中的CORBA服务器端,CORBA服务器端解 析出具体的指令和数据后交给服务器端设备进行处理,并将处理结果通过服务器端ORB包 装后再返回CORBA客户端,从而实现服务的远程调用,这样的应用可以使客户端将一部分 处理任务交给远端的服务器进行处理从而弥补本地客户端处理能力不足的问题。目前,人们普遍利用CORBA系统实现了 JAVA对象的远程调用,但在CORBA系统中 要实现Java对象远程调用,一般还需要预先规划并实现JAVA调用所对应的CORBA接口,即 针对每一个JAVA调用,设计一个接口实现模块,将JAVA调用连接到CORBA实现类,通过接 口实现模块使JAVA调用能够使用CORBA系统的服务,并通过ORB模块实现与远端CORBA系 统的通信,从远端服务器中调用所需的资源。图1为现有在CORBA系统中实现JAVA对象远程调用的原理图,如图1所示,接口 实现模块1 6分别对应不同的JAVA调用,当客户端接收到JAVA对象调用请求时,对应的接口实现模块将调用请求转换为符合CORBA接口规范的请求,并通过CORBA接口和对象模 块提供的客户端CORBA接口和实现类,使用CORBA核心模块中的ORB和CORBA服务将调用 请求发送到服务端0RB,通过服务端对象适配器、ORB接口等,调用服务端CORBA接口和实现 类,并通过服务端的接口实现模块将CORBA调用和对象转换为服务端相应的JAVA调用和对 象,服务端处理完成后,将处理结果经原路径返回客户端。从上述的操作可以看出,JAVA对象远程调用中,所有的JAVA调用均须单独通过特 定的接口实现模块来完成与CORBA服务的对接,每个JAVA调用是单独实现的。如果用户需 求的JAVA调用的接口变更,则需要重新设计接口实现模块。而接口实现模块,其原理是直 接调用CORBA接口来实现与CORBA对接,该模块中需要进行生成接口 IDL文件、编译IDL文 件成Java文件,按照编译完成的Java文件生成相应实现类,使用CORBA的接口连接CORBA 服务等多个复杂步骤才能完成与CORBA的对接,即使很小的修改,也要重新进行一整套复 杂的接口实现模块的设计实现过程,而调用接口变更的情况是很常见的,因此对于现有在 CORBA系统中实现Java对象远程调用的方法,其后期系统维护的工作量很大,且整个实现 架构比较复杂,需要预先规划并设计特定的接口实现模块,实现起来非常困难。

发明内容
本发明实施例提供一种CORBA系统中的JAVA远程调用方法,无需特定的接口实现 模块,实现简单,在JAVA调用变更时所需的维护工作量很小。为达到上述目的,本发明的技术方案具体是这样实现的一种CORBA系统中的JAVA远程调用方法,该方法包括 接收用户的调用请求,通过JAVA动态代理和拦截对所述调用请求进行重组,将所 述调用请求转换为对CORBA服务的请求,通过预先封装的CORBA接口和实现类调用标准 CORBA核心实现远程调用。由上述的技术方案可见,本发明的这种CORBA系统中的JAVA远程调用方法,用户 进行远程JAVA调用时无须关心具体的调用实现过程,也无须实现特定的CORBA接口,使 JAVA远程调用的前期开发和后期维护的工作量大大减少,且实现非常简单。


图1为现有在CORBA系统中实现JAVA对象远程调用的原理图;图2为本发明实施例的JAVA远程调用架构示意图;图3为本发明实施例的JAVA远程调用方法的正向调用流程图;图4为本发明实施例的JAVA远程调用方法的回调流程图。
具体实施例方式为使本发明的目的、技术方案及优点更加清楚明白,以下参照附图并举实施例,对 本发明进一步详细说明。本发明主要是在现有CORBA接口对象模块之上增加两个模块,即CORBA代理模块 和用户接口模块,通过用户接口模块接收用户的JAVA调用请求,并通过CORBA代理模块将 用户的JAVA调用请求统一进行重组和转换,将JAVA调用转换为标准的CORBA协议的对象调用后,再由CORBA接口对象模块和CORBA核心模块完成具体的CORBA调用,使用户进行远 程JAVA调用时只需面对用户接口模块提供的简单的用户接口,无须关心具体的调用实现 过程,也无须为特定的JAVA调用设计实现针对该JAVA调用的特定的CORBA接口模块,因此 该方法只需按照标准CORBA实现统一的CORBA代理模块和用户接口模块,之后若要改变应 用和改变接口,只需重新将用户的JAVA调用在CORBA代理模块中相应地重新指向到其它标 准CORBA对象或实现类的即可,无须再针对不同的JAVA调用进行特定CORBA接口的实现和 更改,使JAVA远程调用的后期维护工作量大大减少,且实现非常简单。图2为本发明实施例的JAVA远程调用架构示意图,如图2所示,该架构从上至下 共分4个模块用户接口模块、CORBA代理模块、CORBA接口对象模块、CORBA核心模块。第1层是用户接口模块,提供了面向用户的远程调用的工具和方法,如绑定到 CORBA命名服务、从CORBA命名服务获取对象、数据发送到CORBA通知服务、从CORBA通知服 务接收通知事件等;具体如初始化CORBA代理模块中的CORBA代理对象,并将用户的JAVA 调用请求交给CORBA代理模块处理。在该模块中,提供给用户的接口及其实现的功能是可 以任意设计的,可以根据具体需要实现,接口的具体实现对于用户来说是透明的,用户并不 需要关心,只需要根据提供的接口进行相应调用即可。第2层是CORBA代理模块,负责对用户接口模块下发的调用请求进行解析、重组和 转发。具体是通过JAVA动态代理和拦截技术拦截用户的JAVA远程调用请求,并在该请求 中插入控制说明,并将加入控制说明的调用请求发送给CORBA接口对象模块,进行具体的 CORBA调用。由于在请求中插入了控制说明,因此CORBA接口对象模块可以根据控制说明 的内容得知该JAVA调用对应哪个标准CORBA对象调用,应执行什么操作,因此实现了将普 通Java调用请求转换为CORBA调用。CORBA代理模块在本架构中起到了承上启下的作用, 对于用户接口模块而言,该模块屏蔽了直接对CORBA的API调用,而对于CORBA接口对象模 块而言,该模块提供了标准的CORBA调用和结果的适配,实际上实现了从Java协议到CORBA 协议的转换。其中,调用请求和响应中包含的各种参数和数据可以采用XML语言进行封装 以保证兼容性和易用性。第3层是CORBA接口对象模块,该模块包含根据CORBA协议封装的具体接口和实 现类,这些接口及其实现类负责通过底层CORBA核心模块实现对象的远程调用。现有CORBA 系统中并没有提供对JAVA对象的回调的支持,而在本发明实施例中,通过在本模块中建立 一个特殊的接口对象,可以供其他接口对象进行正向调用和回调,从而实现了对JAVA对象 的回调,这个特殊的接口对象的具体实现方法如下首先根据标准的CORBA协议建立IDL文 件,该IDL中包含1个正向调用接口对象和1个回调接口对象,正向调用接口对象中实现 用于正向调用的方法(invoke)和用于连通检测的方法(ping),回调对象中实现用于回调 的方法(orudata)和同样用于连通检测的方法(ping);然后将IDL文件编译成Java文件, 并分别实现相应的接口。其中invoke方法是用于正向调用的实现方法,将用户请求调用 的对象和参数作为该方法的输入参数,并查找并输出给相应的对象以实现正向调用,而on_ data方法是用于回调的实现方法,其原理和invoke方法相同;而ping方法是负责检查待 调用的远程对象是不是通的,从而可以实现在不通情况下的自动重连。通过建立支持回调 的接口对象,其他接口对象通过调用这个统一的接口对象都可以实现正向调用和回调。另 外,由于正向调用对象和回调对象中都包括用于连通检测的方法(Ping),因此,CORBA代理模块还可以通过Ping方法对调用对象接口所使用的网络连接进行心跳监测,并对于异常 的接口进行自动重连的操作。当然如果不需要自动重连的功能,在正向调用对象和回调对 象中也可以不包括ping方法。第4层是CORBA核心模块,是符合CORBA规范的标准实现,包含如图中IDL存根 (Stubs)、ORB接口、客户端对象请求代理(Client ORB)、CORBA服务、IDL框架(Skeletons)、 对象适配器(POA)、服务端对象请求代理(Server ORB)等,具体实现可以参考OMG组织有关 CORBA规范的定义,这里不再详细描述。在上述的架构中,实现JAVA远程调用将会非常简单,用户只需按照标准JAVA发出 调用请求,即可实现远程JAVA对象的调用,而无须关心具体调用实现,从而使CORBA系统中 的JAVA远程调用的实现变得简单易行。图3为本发明实施例的JAVA远程调用方法的正向调用流程图,如图3所示,该流 程包括如下步骤步骤301,接收调用请求。用户接口模块接收客户端用户发出的JAVA调用请求。步骤302,拦截用户的调用请求。CORBA代理模块通过JAVA动态代理和拦截技术, 如JDK,将该请求拦截。步骤303,判断调用的对象是否为空。CORBA代理模块判断请求中所调用的对象是 否为空,若是,则返回步骤301,否则执行步骤304。这里判断调用对象是否为空是指判断用 户调用的JAVA对象是否在CORBA接口对象模块中有对应的CORBA实现类。
数格式
JAVA对象预先需要绑定到CORBA的命名服务上,具体绑定方式可以采用如下的函
^iparam bindName绑定的名称 ^iparam impIObj绑定对象的一个实现类 *@throws CorbaUtilException 需要捕获的异常
public void bind (String bindName,Object implObj)throws CorbaUtilException 函数。 其实现代码如下 public class TestBindService{
public static void main(String[]args){
CorbaUtil util = CorbaUtil. getlnstance(); Properties props = System. getProperties();
props.put ( “ ORBInitRef “, “ NotificationService = corbaloc:Iocalhost14100/NotificationService ; ;NameService = corbaloc:localhost:5555/ NameService");try {util.bind(" testBindName “,new TestAlarmServiceImpl ()); //创建一个实现类
6
}catch (CorbaUtiIException e){e. printStackTrace ();}}}步骤304,获取调用的方法、参数并重新进行封装。重新封装可以采用往调用请求中插入控制说明的方法,将调用的JAVA对象指向 到标准的CORBA实现类,以实现调用请求中JAVA对象到标准的CORBA实现类的转换。控制 说明的内容可以采用XML格式进行封装,以保证良好的兼容性,当然也可以采用其它私有 的格式,只要能够被识别即可。其中,本发明在将JAVA调用适配成CORBA调用过程中,内部通过定义XML格式的 控制语句,实现了请求的重定义和封装,具体的XML格式如下< ? xml version = “ 1.0〃 encoding = “ gb2312〃 ? ><ControlParam><methodName>say</methodName><invokeParam>hello</invokeParam><callbackId>4f6a67ee-4c67-4463-9594-a8cc02ddbfbb</callbackId><callbackName>com. cattsof t. corba. interface. IHel IoCal lback</ callbackName></ControlParam>从这个XML可以知道,本次远程调用的方法是say,方法的参数是hello,回调对象
的名称是 com. cattsoft. corba. interface. IHelIoCallback,回调对象的标识是 4f6a67ee -4c67-4463-9594-a8cc02ddbfbb。这样当这个控制请求通过CORBA服务真正传递到对端以 后,就可通过JAVA的反射机制,调用远程对象的say方法,并将“hello”作为参数传递过去, 并将结果返回,实现远程调用。步骤305,将重新封装后的调用请求发送到CORBA核心模块。步骤306,CORBA核心模块中的客户端ORB将调用请求发送到服务端0RB。步骤307,服务端ORB收到调用请求后将请求转发给服务端的CORBA接口对象模块。步骤306和307是标准的CORBA远程调用过程,本发明在这里使用现有技术实现, 因此不再赘述具体详细实现过程。步骤308,判断调用请求中请求的服务类是否为空,若是则返回步骤307,否则执 行步骤309。步骤309,判断请求参数是否为空,若是,则执行步骤310,否则执行步骤311。步骤310,调用用户请求的实现类,传入空参数,并将结果返回。在调用用户请求的实现类时,需要按照名称,从CORBA命名服务获取预先绑定的 JAVA对象,返回对象是ServiceClass类型,具体实现的函数如下^iparam serviceName 月艮务名禾尔^iparam serviceClass 月艮务的类对象
^ithrows CorbaUtiIException白勺胃胃*/public Object IocatService(String serviceName, Class serviceClass) throwsCorbaUtilException 函数其实现代码如下public class TestLocator{public static void main(String[]args){CorbaUtil util = CorbaUtil. getlnstance();Properties props = System. getProperties();props, put ( “ ORBInitRef “ , “ NotificationService = corbaloc: :hx2009:14100/NotificationService ; ;NameService = corbalochx20095555/NameService“);try{TestAlmCalIbackImpl ac = new TestAlmCalIbackImpl();ITestAlarmService services = (ITestAlarmService)util. IocatService(“ testBindName“,ITestAlarmService. class);String [] retuns = services. returnResult (“ service2 “);System, out. println (retuns
);} catch(Exception e) {e. printStackTraceO ;}}}步骤311,判断调用参数中是否包含回调对象,若是,则执行步骤312,否则执行步 马聚313ο步骤312,为回调对象生成动态代理对象,调用用户请求的实现类,将代理对象作
为调用参数,将调用结果返回。步骤313,调用用户请求的实现类,并将结果返回。图4为,本发明实施例的JAVA远程调用方法的回调流程图,如图4所示,该流程包 括如下步骤步骤401,接收回调请求。步骤402,拦截回调请求。同样通过JAVA动态代理和拦截技术拦截。步骤403,判断回调的对象是否为空。若是,则返回步骤401,否则执行步骤404。步骤404,获取回调的方法、参数并重新进行封装。封装方法同调用请求步骤405,将封装后的请求发送到CORBA核心模块。步骤406,服务端ORB将请求发送到客户端0RB。步骤407,客户端ORB收到请求将请求转发到客户端的CORBA接口对象模块。步骤408,判断用户请求调用的服务类是否为空,若是则返回步骤407,否则执行步骤409。步骤409,判断请求参数是否为空,若是,则执行步骤410,否则执行步骤411。步骤410,调用用户请求的实现类,传入空参数,并将结果返回。步骤411,调用用户请求的实现类,并将结果返回。回调的流程实际上和正向调用的过程相同,只不过调用的对象是回调的对象,调 用方向是由服务端回调客户端对象。执行回调的前提是必须先有一次正向调用,将回调对 象传递给被调用方,然后被调用方才可以根据需要随时反向调用请求方,实现双向调用。另外,在调用和回调过程中,还涉及将数据发送到事件通道和从事件通道接收数 据的过程,具体实现的函数如下将数据发送到事件通道^iparam xmlMsgs XML 格式的消息对象氺Oparam channeled ilM WfeiK^ithrows CorbaUtilExc印tion 需要捕获的异常*/public void sendToChanne 1 (String xmlMsgs, int channe lid) throwsCorbaUti IException 函数将数据发送到事件通道^iparam xmlMsgs以数组形式存放的XML格式的消息对象^iparam channeled 通道的标识^ithrows CorbaUtiIException白勺胃胃*/public void sendToChanne 1 (Str ing [] xmlMsgs , int channe lid) throwsCorbaUti IException 函数其具体实现代码如下public class TestCorbaSender{public static void main(String[] args){CorbaUtil util = CorbaUtil. getlnstance();Properties props = System. getProperties();props, put ( “ ORBInitRef “ , “ NotificationService = corbaloc: :hx2009:14100/NotificationService ; ;NameService = corbalochx20095555/NameService“);
try {
util. sendToChanne1(‘ Thread, sleep (5000); }catch(Exception e){ e. printStackTrace ();
}
hello" ,0)
从事件通道接收数据从通道获取数据,该方法供没有回调对象的使用,是阻塞方法^iparam channelld 通道的标识^ithrows CorbaUtiIException白勺胃胃*/public Object receiveFromChannel (int channelld) throwsCorbaUti IException 函数从通道获取数据,并调用pusher的回调方法将数据发出^iparam pusher 该接 口 的实现类氺Oparam channeled ilM WfeiK^ithrows CorbaUtiIException白勺胃胃*/public void receiveFromChannel(ICorbaPusher pusher, int channelld) throws CorbaUtilException 函数。其实现代码如下public class TestCorbaReceiver{public static void main(String[]args){CorbaUtil util = CorbaUtil. getlnstance ();Properties props = System. getProperties();props, put ( “ ORBInitRef “ , “ NotificationService = cοrba 1 οc hχ2OO9 141 OO/Notif icationService ; ;NameService = corbalochx20095555/NameService“);
0153]try{
0154]util. receiveFromChannel(new CorbaPusherImpl(),0);
0155]}catch(Exception e){
0156]e. printStackTrace ();
0157]}}}由上述的实施例可见,本发明的JAVA远程调用方法的关键在于将用户的JAVA调 用请求通过重组转换为CORBA系统可识别并操作的标准CORBA调用,再通过标准的CORBA 远程调用过程,将用户的JAVA调用从本地客户端传送到远端的服务端,再通过CORBA实现 服务端实现类的调用并将调用的结果返回客户端,从而使JAVA远程调用对于用户完全透 明,用户不需要为每一种JAVA远程调用而单独设计特定的接口实现模块以与CORBA核心模 块对接,使JAVA远程调用的后期维护的工作量大大减少,且实现非常简单。所应理解的是,以上所述仅为本发明的较佳实施方式而已,并不用于限定本发明 的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含 在本发明的保护范围之内。
随附XML格式以及示例代码如下。XML格式
本发明在将JAVA调用适配成CORBA调用过程中,内部通过定义XML格式的控制语句, 实现了请求的重定义和封装,具体的XML格式如下
< ? xml version = “ 1.0〃 encoding = “ gb2312〃 ? > <ControlParam>
<methodName>say</methodName> <invokeParam>hello</invokeParam>
<callbackId>4f6a67ee-4c67-4463-9594-a8cc02ddbfbb</callbackId> <callbackName>com.cattsoft.corba. interface.IHe1IoCallback</ callbackName>
</ControlParam>
从这个XML可以知道,本次远程调用的方法是say,方法的参数是hello,回调对象的 名称是 com. cattsoft. corba. interface. IHelloCallback,回调对象的标识是 4f6a67ee_4 c67-4463-9594-a8cc02ddbfbb。这样当这个控制请求通过CORBA服务真正传递到对端以后, 就通过JAVA的反射机制,调用远程对象的say方法,并将“hello”作为参数传递过去,并将 结果返回。 示例代码 绑定对象
public class TestBindService{
public static void main(String[]args){
CorbaUtil util = CorbaUtil. getlnstance(); Properties props = System. getProperties(); props, put ( “ ORBInitRef “, “ NotificationService = corbalocIocalhost14100/NotificationService ; ;NameService =corbalocIocalhost5555/NameService“); try {
util.bind(〃 testBindName",newTestAlarmServicelmpl()) ;// 创
建一个实现类
}catch(CorbaUtilException e){ e. printStackTrace ();
ι
ι
ι
获取对象
public class TestLocator{
public static void main(String[]args){
CorbaUtil util = CorbaUtil. getlnstance(); Properties props = System. getProperties(); props, put ( “ ORBInitRef “, “ NotificationService =corbaloc::hx2009:14100/NotificationService ; ;NameService = corbaloc::hx20095555/NameService“); try {
TestAlmCalIbackImpl ac = newTestAlmCalIbackImpl();
ITestAlarmService services = (ITestAlarmService)util. IocatService(“ testBindName“,
ITestAlarmService. class); String[Jretuns = services. returnResult{“ service2〃 ); System, out. println(retuns
); }catch (Exception e){
e. printStackTrace ();
ι
ι
ι
发送数据到事件通道
public class TestCorbaSender{
public static void main(String[]args){
CorbaUtil util = CorbaUtil. getlnstance(); Properties props = System. getProperties(); props, put ( “ ORBInitRef “, “ NotificationService = corbaloc::hx2009:14100/NotificationService ; ;NameService = corbaloc::hx2009:5555/NameService“); try {
util. sendToChannel{“ hello",0); Thread, sleep (5000); }catch (Exception e){
e. printStackTrace ();
ι
ι
ι
从事件通道接收数据
public class TestCorbaReceiver{
public static void main(String[]args){
Co 由 aUtil util = CorbaUti1. getlnstance(); Properties props = System. getProperties(); props, put ( “ ORBInitRef “, “ NotificationService = corbaloc::hx2009:14100/NotificationService ; ;NameService = corbaloc::hx2009:5555/NameService“); try {util. receiveFromChanne1(new CorbaPusherImpl(),0) }catch(Exception e){
e. printStackTrace ();
ι
ι
ι
权利要求
一种CORBA系统中的JAVA远程调用方法,其特征在于,该方法包括接收用户的JAVA远程调用请求,通过JAVA动态代理对所述调用请求进行拦截并重组,将所述JAVA远程调用请求转换为对标准CORBA实现类的调用请求,通过CORBA接口调用标准CORBA核心实现远程调用。
2.如权利要求1所述的JAVA远程调用方法,其特征在于,所述通过JAVA动态代理对所 述调用请求进行重组,包括通过JAVA动态代理在所述调用请求中添加用于CORBA实现类 的控制语句。
3.如权利要求2所述的JAVA远程调用方法,其特征在于,所述控制语句采用XML格式 封装。
4.如权利要求2所述的JAVA远程调用方法,其特征在于,所述通过CORBA接口调用标 准CORBA核心实现远程调用包括预先建立统一调用接口,其中包含正向调用的接口对象和回调的接口对象,通过所述 控制语句由所述统一调用接口调用标准CORBA核心进行远程调用。
5.如权利要求4所述的JAVA远程调用方法,其特征在于,所述正向调用接口对象包括 用于实现正向调用的方法和用于连通检测的方法;所述回调接口对象包括用于实现回调 的方法和用于连通检测的方法。
全文摘要
本发明公开了一种CORBA系统中的JAVA远程调用方法,该方法接收用户的调用请求,通过JAVA动态代理和拦截对所述调用请求进行重组,将所述调用请求转换为对CORBA服务的请求,通过预先封装的CORBA接口和实现类调用标准CORBA核心实现远程调用。用户进行远程JAVA调用时无须关心具体的调用实现过程,也无须实现特定的CORBA接口,使JAVA远程调用的前期开发和后期维护的工作量大大减少,且实现非常简单。
文档编号G06F9/46GK101923485SQ20091024608
公开日2010年12月22日 申请日期2009年12月1日 优先权日2009年6月17日
发明者黄翔 申请人:大唐软件技术股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1