XX学院《开源中间件技术》实验指导书_第1页
XX学院《开源中间件技术》实验指导书_第2页
XX学院《开源中间件技术》实验指导书_第3页
XX学院《开源中间件技术》实验指导书_第4页
XX学院《开源中间件技术》实验指导书_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、开源中间件技术实验指导书XXXX2012年12月目 录实验一 RPC客户与服务器1一、实验目的1二、实验环境1三、实验原理1四、实验内容及步骤1五、实验注意事项3六、实验报告要求3七、思考题3实验二 动态链接库4一、实验目的4二、实验环境4三、实验原理4四、实验内容及步骤5五、实验注意事项5六、实验报告要求5七、思考题5实验三 COM组件6一、实验目的6二、实验环境6三、实验原理6四、实验内容及步骤6五、实验注意事项7六、实验报告要求8七、思考题8实验四 DCOM8一、实验目的8二、实验环境9三、实验原理9四、实验内容及步骤9五、实验注意事项12六、实验报告要求13七、思考题13实验五 COR

2、BA之IOR15一、实验目的15二、实验环境15三、实验原理15四、实验内容及步骤15五、实验注意事项16六、实验报告要求16七、思考题16实验六 CORBA之命名服务16一、实验目的16二、实验环境16三、实验原理17四、实验内容及步骤17五、实验注意事项17六、实验报告要求17七、思考题18实验七 RMI18一、实验目的18二、实验环境18三、实验原理18四、实验内容及步骤18五、实验注意事项19六、实验报告要求19七、思考题19实验八 EJB19一、实验目的19二、实验环境20三、实验原理20四、实验内容及步骤20五、实验注意事项21六、实验报告要求21七、思考题21实验一 RPC客户与

3、服务器一、实验目的通过编写RPC的客户服务程序,并调用相应的函数,掌握RPC的原理和编写RPC程序的基本方法。二、实验环境Visual C+ ,Windows三、实验原理RPC其实也是种C/S的编程模式,类似C/S Socket 编程模式,但要比它更高一层。当在建立RPC服务以后,客户端的调用参数通过底层的RPC传输通道,可以 是UDP,也可以是TCP(也即TI-RPC-无关性传输),并根据传输前所提供的目的地址及RPC 上层应用程序号转至相应的RPC Application Porgramme Server ,且此时的客户端处于等 待状态,直至收到应答或Time Out超时信号。四、实验内容

4、及步骤内容:创建一个简单的客户机服务器的分布式应用程序,实现客户应用程序在一个远程过程调用中,向服务器传递一个整数,经过服务器端求阶乘后,将最终结果从客户机端输出步骤:1开发接口,具体步骤包括:1.1创建接口模板在命令行方式下运行uuidgen工具,生成文件Rpctest.idlD:Program FilesMicrosoft Visual StudioCommonToolsuuidgen /I /o Rpctest.idl1.2替换Rpctest.idl中接口的定义,改为:interface Rpctest /远程过程调用的求阶乘函数 long RpcFactorial(in long nV

5、al); / 出现 的部分表示属性 void Shutdown(void);/ 终止服务器程序函数Shutdown 必须要1.3使用文本编辑器编写ACF(属性配置文件),Rpctest.acfauto_handle / 相关属性 /implicit_handle (handle_t Rpctest_IfHandle)interface Rpctest /注意:要和idl中接口名称一致1.4使用MIDL编译器进行编译(注:Rpctest.idl和Rpctest.acf都放Bin目录下)在命令行方式下运行MIDL.EXE,D:Program FilesMicrosoft Visual Studio

6、VC98Binmidl Rpctest.idl 编译后生成文件 Rpctest.h、Rpctest_c.c、Rpctest_s.c2.开发服务器程序,具体步骤包括:2.1 VC环境下建一个项目Rpctestserver,把Rpctest.h、Rpctest.idl 、Rpctest.acf和Rpctest_s.c放到这个项目下面,然后导入Rpctest.h Rpctest_s.c,创建memstub.h(内存管理函数)2.2编写远程阶乘调用函数:新建文件Rpctest_s_f.c中实现;同时Rpctest_s_f.c中也包括了终止服务器程序函数Shutdown2.3编写服务器源程序:就是Rpc

7、test_s.c 一点都不改变。添加一个新文件main.cpp 里面放main()函数。2.4在VC环境下编译和链接服务器端程序,最终生成Rpctestserver.exe文件注:在VC中Project-Settings-Link中添加两个RPC运行库:rpcrt4.lib和 rpcns4.lib3.开发客户机程序,具体步骤包括:3.1VC环境下建一个空项目Rpctestclient,然后添加qsorts.c,把Rpctest.h、Rpctest.idl 、Rpctest.acf和Rpctest_c.c放到这个项目下面,然后导入Rpctest.h Rpctest_c.c memstub.h3.

8、2Rpctest_s.c 一点都不改变。添加一个新文件main_c.cpp 里面放main()函数3.3在VC环境下编译和链接客户端程序,最终生成Rpctestclient.exe文件(在Debug文件里面)注:同上,也需在此工程中添加rpcrt4.lib和rpcns4.lib。程序源代码清单:文件 简单描述Rpctest.idl 接口定义语言文件Rpctest.acf 属性配置文件Rpctest.h 头文件Rpctest_c.c 客户端存根Rpctest_s.c 服务器端存根main_c.cpp 客户端主程序main.cpp 服务器端主程序Rpctest_s_f.c 远程调用程序五、实验注意

9、事项1、要先运行服务器程序,再运行客户端程序六、实验报告要求1、书写程序的编写过程。2、附程序代码,包括IDL。3、粘贴程序的运行结果的图片。七、思考题1、如何利用RPC传递复合性数据结构?实验二 动态链接库一、实验目的掌握动态链接库的基本原理,并通过实验学习简单无GUI界面的动态链接库的编写和调试方法。二、实验环境Visual C+ ,Windows 三、实验原理DLL文件即动态链接库文件,是一种可执行文件,它允许程序共享执行特殊任务所必需的代码和其他资源。Windows提供的DLL文件中包含了允许基于Windows的程序在Windows环境下操作的许多函数和资源。 DLL多数情况下是带有D

10、LL扩展名的文件,但也可能是EXE或其他扩展名。它们向运行于Windows操作系统下的程序提供代码、数据或函数。程序可根据DLL文件中的指令打开、启用、查询、禁用和关闭驱动程序。 DLL的全称是Dynamic Link Library, 中文叫做“动态链接文件”。在Windows操作系统中, DLL对于程序执行是非常重要的, 因为程序在执行的时候, 必须链接到DLL文件, 才能够正确地运行。而有些DLL文件可以被许多程序共用。因此, 程序设计人员可以利用DLL文件, 使程序不至于太过巨大。但是当安装的程序越来越多, DLL文件也就会越来越多, 如果当你删除程序的时候, 没有用的DLL文件没有被

11、删除的话, 久而久之就造成系统的负担了。 DLL是动态连接库。使用动态连接库的一些好处是: 1.多个应用程序共享代码和数据:比如Office软件的各个组成部分有相似的外观和功能,这就是通过共享动态连接库实现的。 2.在钩子程序过滤系统消息时必须使用动态连接库。3.动态连接库以一种自然的方式将一个大的应用程序划分为几个小的模块,有利于小组内部成员的分工与合作。而且,各个模块可以独立升级。如果小组中的一个成员开发了一组实用例程,他就可以把这些例程放在一个动态连接库中,让小组的其他成员使用。4.为了实现应用程序的国际化,往往需要使用动态连接库。使用动态连接库可以将针对某一国家、语言的信息存放在其中。

12、对于不同的版本,使用不同的动态连接库。在使用AppWizard生成应用程序时,我们可以指定资源文件使用的语言,这就是通过提供不同的动态连接库实现的。 VC+、C+ Builder、Delphi都可以编写DLL文件。Visual Basic 5.0以上版本也可以编写一种特殊的DLL,即ActiveX DLL。 DLL不是独立运行的程序,它是某个程序的一个部分,它只能由所属的程序调用。用户不能,也不需要打开它。用VC+编写动态链接有以下四种类型:Win32 DLL、MFC常规DLL(动态链接MFC)、MFC常规DLL(静态链接MFC)、MFC扩展DLL等,关于它们之间的区别,在此不一一介绍,可参阅

13、相关文档。本程序的编写为Win32 DLL。四、实验内容及步骤1、创建DLL文件1)打开visual c+ 6.0通过new创建一个win32 Dynamic-link Libary的工程,命名为FIRSTDLL2)接着选择最后一个选项,让系统创建一些必要的文件3)修改FIRSTDLL.cpp的代码。4)编译、链接生成DLL 2、调用DLL1)同样通过new创建一个工程,该工程为win32 Console application,命名USEFIRSTDLL2)在USEFIRSTDLL.cpp文件中编写如下代码。4)编译、链接生成可执行程序。void main(void) typedef int

14、(*pMax)(int a,int b); /定义指向和DLL中相同的函数原型指针HINSTANCE HDLL; /定义句柄pMax Max;HDLL=LoadLibrary(FIRSTDLL.dll); /加载动态链接库FIRSTDll.dll文件,注意指明FIRSTDLL的地址哦if(HDLL=NULL) printf(cannot find the dll file);Max=(pMax)GetProcAddress(HDLL,Max); /然后通过GetProcAddress()函数获取导入到应用程序中的函数指针if(Max=NULL) printf(cannot find the M

15、ax funtion);int A=Max(5,8); printf(比较的结果为: %d ,A);FreeLibrary(HDLL);/卸载MyDll.dll文件; 五、实验注意事项1、 DLL的导出函数的说明方法2、 使用DLL的方法六、实验报告要求1、书写程序的编写过程。2、附程序代码。3、粘贴程序的运行结果的图片。七、思考题1、如何在其他语言如JAVA中使用Visual C+编写的动态链接库?实验三 COM组件一、实验目的通过完成简单的进程内组件和客户程序,掌握COM的基本原理和进行COM组件编程的基本技术和方法。二、实验环境 Visual C+、 Windows 三、实验原理COM

16、是由 Microsoft 提出的组件标准,它不仅定义了组件程序之间进行交互的标准,并且也提供了组件程序运行所需的环境。在 COM 标准中,一个组件程序也被称为一个模块,它可以是一个动态链接库,被称为进程内组件(in-process component);也可以是一个可执行程序(即 EXE 程序),被称作进程外组件(out-of-process component)。一个组件程序可以包含一个或多个组件对象,因为 COM 是以对象为基本单元的模型,所以在程序与程序之间进行通信时,通信的双方应该是组件对象,也叫做 COM 对象,而组件程序(或称作 COM 程序)是提供 COM 对象的代码载体。COM

17、 对象不同于一般面向对象语言(如 C+ 语言)中的对象概念,COM 对象是建立在二进制可执行代码级的基础上,而 C+ 等语言中的对象是建立在源代码级基础上的,因此 COM 对象是语言无关的。这一特性使用不同编程语言开发的组件对象进行交互成为可能。四、实验内容及步骤实验内容按照组件化程序设计方法,用Visual C+编写实现包含IAdd、IStr、二个接口的.dll组件,并利用客户端应用程序完成对各接口的充分测试。IUnknownIMathIStr接口成员函数IAddAdd(long n1, long n2, long * pnVal)-加法运算Mul(long n1, long n2, lon

18、g *pnVal)-乘法运算IStrCat(BSTR s1, BSTR s2, BSTR *psVal)-字符串连接步骤:1.分析组件结构。2.编写简单.dll组件。3.逐步添加接口。4.编写客户端应用程序进行测试。用regedit命令打开注册表注销操作:RegSvr32 /u c:XXXXX.dll注册操作:RegSvr32 c:XXXXX.dll在运行客户程序前,必须先注册组件程序。简单Com实现步骤:步骤1:建立一个工作区(WorkSpace)。在工作区中,新建一个ATL工程(Project)。命名为SimpleCom1,并选择DLL方式步骤2:按默认进行。选择 DLL 类型、不合并代理

19、和存根代码、不支持MFC、不支持MTS步骤3:New Atl Object. 选择Simple Object步骤4:输入名称和属性,属性按默认进行,也就是 custom方式步骤5:增加两个方法。Add(long n1, long n2, long * pnVal)Div(VARIANT a, VARIANT b, VARIANT *pVal);并完成代码步骤6:添加第二个接口IStr步骤7:打开头文件,手工增加类的派生关系和接口入口表 ,然后保存步骤8:增加方法Cat(BSTR s1, BSTR s2, BSTR *psVal)并完成代码步骤9:编译,注册客户端实现步骤:Main函数完成三个函

20、数Div()、Add ()和Cat()的调用:五、实验注意事项1、 MIDL的编写方法。2、 组件DLL中导出函数的编写。3、 类厂的编写方法。六、实验报告要求1、书写程序的编写过程。2、附程序代码,包括IDL。3、粘贴程序的运行结果的图片。七、思考题1、如何编写进程外组件?实验四 DCOM一、实验目的通过完成简单的进程内组件和客户程序,掌握DCOM的基本原理和进行DCOM组件编程的基本技术和方法。二、实验环境Visual C+、 Windows三、实验原理 DCOM代表的是“Distributed(分布式)”COM。在前面的部分中,我们已经讲解了运行在同一部计算机的COM客户和服务器。在这一

21、部分,我们将讨论如何将它扩展到DCOM的领域和分布式计算。 COM和DCOM的区别COM和DCOM应用之间的大部分区别都被开发者隐藏起来。客户和服务器端的程序可以一样地编写,而不管程序在哪里运行。这个概念被称为本地/远程透明。当然,分布和本地COM的内部工作是有着一些区别的。本地的通信可通过许多的方式来完成,包括简单的Windows信息,而连接到一个远程的计算机需要一个全新的对象层和网络传输。除了这些大的区别外,你的程序需要做的改动并不大。与所有的COM通信一样,只有在客户请求一个服务器的接口时才会开始。在DCOM中,客户端调用CoCreateInstanceEx(),传送服务器计算机的一个描

22、述和请求一个类标识器(CLSID)和接口。该请求由服务控制管理器处理(Service Control Manager,SCM),它是Windows的一部分。SCM负责在服务器计算机上创建和激活COM对象。在DCOM中,SCM将尝试启动远程计算机上的服务器。一旦创建了远程的COM服务器,所有的调用将通过proxy和stub对象配置。proxy和stub使用RPC(Remote Procedure Calls,远程过程调用)进行通信,RPC处理所有网络交互。在服务器端,stub对象负责配置,而客户端则由proxy负责。跨网络的数据传送由RPC负责。实际上,DCOM使用一个扩展类型的RPC,称为对象

23、RPC(Object RPC)或者ORPC。RPC可以运行在多种不同的协议上,包括有TCP/IP,UDP,NetBEUI,NETBIOS和命名管道。标准的RPC协议是UDP(用户数据报协议)。UDP是一个无连接的协议,看来与DCOM这种面向连接的系统配合并不是一个好主意。不过这并不是一个问题,DCOM自动负责管理连接。四、实验内容及步骤内容1、编写服务器端程序。2、编写代理/存根DLL3、编写简单的测试客户程序。步骤1、建立服务器程序:1.1 用VC+建立一个名为Test的workspace。1.2在workspace中加入一个新的工程,选ATL COM Appwizard项,命名为AddSu

24、b,下一步server类型选service(EXE)。1.3 添加组件对象:打开InsertNew ATL Object,选Simple Object,在names下shortname填AddSubCom,如果需要可以将interface改为IAdd(默认为IAddSub),在attributes下interface选custom,则该com组件接口将从IUnknown继承,如果aggregation选yes,则该组件可被聚合。1.4 a) 组件接口函数的定义:打开AddSub.idl文件,在接口IAdd下填写接口函数的声明:interface IAdd : IUnknown/接口函数的声明H

25、RESULT AddMatrix(in int length, in,size_is(length) double* pfMatrix, in,size_is(length) double* psMatrix, out,size_is(length) double* prMatrix); ;另一种方法是:在workspace的class标签中,右键点击IAdd,选Add Method,在对话框中添加。b)组件接口函数的声明(如果在上一步中使用第二种方法添加,则无需此步):打开AddSubCom.h文件,在类声明后面加入:STDMETHOD(AddMatrix)(int length,doubl

26、e* pfMatrix,double* psMatrix,double* prMatrix);c) 组件接口函数的实现:打开AddSubCom.cpp文件,加入接口方法的实现函数:STDMETHODIMP CAddSubCom:AddMatrix(int length,double* pfMatrix,double* psMatrix,double*prMatrix) /函数功能return NOERROR;1.5 组件注册:一般地,编译完成服务器自动注册;如果使用编译好的服务器,注册方法是用/Register参数执行服务器程序,如C:MyDirAddSub /RegServer,解注册用/U

27、nregServer(参见AddSub.cpp源码)。2、建立代理/存根DLL2.1 建立一个新的工程命名为PSAddSub,工程选Win32 Dynamic-Link Library,其余默认。2.2 在工程中新建一个文本文件PSAddSub.def,内容如下: LIBRARY PSAddSubEXPORTS DllGetClassObject PRIVATE DllCanUnloadNow PRIVATE DllRegisterServer PRIVATE DllUnregisterServer PRIVATE GetProxyDllInfo PRIVATE2.3将AddSub.idl生成

28、的AddSub.h、AddSub_i.c、AddSub_p.c、dlldata.c四个文件加入工程。2.4 projectsettingc/c+中category Preprocessor definitions加入REGISTER_PROXY_DLL, _WIN32_DCOM, projectsettinglink中Object/library modules加入rpcndr.lib rpcns4.lib rpcrt4.lib ,然后编译,生成PSAddSub.dll。2.5 注册dll:c:MyDirregsvr32 PSAddSub.dll;也可以用VC+的toolsRegister C

29、ontrol。3、建立客户程序在客户端主程序中加入如下程序段:#include #include #include #include ./Server/Server.hint main()CString *pszHostName=new CString(7);/char *pszHostName=7;/pszHostName=;HRESULT hResult;/ Prepare COM for usehResult = CoInitialize(NULL);/初始化COM库if (FAILED(hResult) return 0;IClassFact

30、ory *pClf;IUnknown *pIUnknown;LPOLESTR lpszHostname= pszHostName-AllocSysString();COSERVERINFO ServerInfo = 0, lpszHostname, NULL, 0 ;/获取服务器信息hResult=CoGetClassObject(CLSID_AddSubCom,CLSCTX_SERVER,&ServerInfo,IID_IClassFactory,(void*)&pClf);/创建类厂if (FAILED(hResult) return 0;hResult = pClf-CreateInst

31、ance(NULL,IID_IUnknown,(void*) &pIUnknown);/创建组件对象 if (FAILED(hResult) pClf-Release();return 0;pClf-Release();/释放类厂IAddSubCom *pIAddMatrix;hResult = pIUnknown-QueryInterface(IID_IAddSubCom, (void*) &pIAddMatrix);/查询接口if (FAILED(hResult) pIUnknown-Release();return 0;/call functiondouble pfSubMatrix10

32、, psSubMatrix10, prSubMatrix10 ;for(int i=0; iAddMatrix(SubMatrixLength,pfSubMatrix,psSubMatrix,prSubMatrix);/调用接口函数 pIAddMatrix-Release();/we have done with the IAddMatrix interface/ Were done with the Matrix objectpIUnknown-Release();pIUnknown = NULL;CoUninitialize();/释放COM库for(i=0; iSubMatrixLeng

33、th ;i+)printf(%ft, prSubMatrixi) ;printf(n) ;return 0 ;客户端工程必须包含AddSub.h和AddSub_i.c文件,对于AddSub_i.c文件projectsettingc/c+中Precompiled Headers应选Automatic use of precompiled headers。注意:在客户端,无论编写debug还是release程序,projectsettingc/c+中的code generation下的Use run-time library应选DEBUG Multithreaded DLL。4 客户调用服务器客户

34、可以远程调用服务程序,代理/存根DLL必须在两端都有副本,并且注册,这样客户就可以通过代理/存根DLL调用远端的服务器了。五、实验注意事项1、 先单机然后再分布式。2、 DCOM实验环境的调式。六、实验报告要求1、书写程序的编写过程。2、附程序代码,包括IDL。3、粘贴程序的运行结果的图片。七、思考题1、跨语言调用实验五 CORBA之 IOR一、实验目的IOR:Interoperable Object Reference,可互操作对象引用;掌握基于IOR能够实现CORBA对象定位。二、实验环境1、OmniORB2、Visual C+三、实验原理 CORBA是一个完全中间性的语言,CORBA 专

35、门确保让我们不必担心客户机环境和服务器环境之间的差异。可以使用接口定义语言(IDL)定义开发时使用接口的 Client 和实现接口的 Server 所需要的信息。Client 和 Server 的具体实现代码并不在IDL定义中编写,而是使用某种目标语言的IDL 编译器生成所需的代码存根及helper类,Client 和 Server再使用真正的编程语言来进行具体实现。为了保证在不同的 CORBA 产品基础之上构建的分布式对象可以相互通信,Client和Server通过ORB(对象请求代理)进行通信。一般的运行流程是Client把请求发送给ORB,ORB再把请求发送给Server,Server把

36、返回结果发送ORB,ORB再把返回结果发送给Client。ORB可以说Client和Server之间的翻译者。即使Client和Server使用不同的编程语言编写,只要是符合相同的IDL定义,ORB也可以完成相互的通信四、实验内容及步骤步骤:1、下载Corba-omniorb开源代码首先到/下载一个win32的OmniORB。文件名为“omniORB-4.1.1-x86_win32_vc6.zip”。然后解压缩至文件夹“ D:omniORB-4.1.1”。2、设置环境变量2.1、将“D:omniORB-4.1.1binx86_win32

37、;”加入到系统环境变量path中;2.2、设置用户环境变量“OMNI_ROOT= D:omniORB-4.1.1”。3、编辑IDL文件使用记事本写一个Cobartest.idl文件,idl文件定义了的Cobartest接口,其中包含一个Div ()方法。文件内容如下:interface Cobartest double Div(in double a , in double b); Solark:这个IDL文件和COM及DCOM的IDL文件格式区别比较大。注意:1.没有VARIANT 2.要用,而不是,3.返回类型不一样了 4. 后要加入 ;5. 由于设置了路径,所以不需要把Cobartest

38、.idl 要放到bin文件夹下4、编译IDL文件在cmd中对idl进行编译:进入Cobartest.idl文件所在目录,使用omniidl -bcxx Cobartest.idl对Cobartest.idl进行编译。其中-bcxx告诉编译器将idl映射为C+,如果编译没有错误,则会在同一个目录下生成两个文件:分别是 Cobartest.hh,和CobartestSK.cc。Cobartest.hh是所有接口类型定义所在的文件,服务器和客户端的实现都需要这两个文件,作为相互之间交互的接口。5、编辑由IDL工具生成的文件修改Cobartest.hh和CobartestSK.cc两个生成文件扩展名称

39、,将两个文件的后缀名分别改成.h和.cpp。并把CobartestSK.cpp中的#include Cobartest.hh改成#include Cobartest.h。6、按VC向导新建控制台项目testOrbServer新建一个空的工作空间testorb,把testOrbServer和testOrbClient两个工程都放在里面。再新建一个VC6 win32 Console的testOrbServer空工程。将Cobartest.h和CobartestSK.cpp拷贝到项目所在目录,并将文件插入项目中,新建一个testOrbServer.cpp的文件。#include #include C

40、obartest.hclass Cobartest_impl:public virtual POA_Cobartestpublic : / virtual double Div(double a, double b); virtual double Div(double a, double b);double Cobartest_impl:Div(double a, double b,) double c=a/b; return c;int main(int argc, char* argv) try CORBA:ORB_var orb = CORBA:ORB_init(argc, argv)

41、;/初始化ORB CORBA:Object_var obj= orb-resolve_initial_references(RootPOA); PortableServer:POA_var poa = PortableServer:POA:_narrow(obj); PortableServer:POAManager_var mgr = poa-the_POAManager(); mgr-activate(); Cobartest_impl Cobartest_servant; Cobartest_var tm = Cobartest_servant._this(); CORBA:String

42、_var str = orb-object_to_string(tm); cout str run(); catch (const CORBA:Exception&) cerr exception endl; return 1; return 0;7、按VC向导新建控制台项目testOrbClient新建一个VC6 win32 Console的testOrbClient空项目。将Cobartest.h和CobartestSK.cpp拷贝到项目所在目录,并将文件插入项目中,新建一个testOrbClient.cpp的文件。/ testOrbClient.cpp : Defines the ent

43、ry point for the console application.#include #include Cobartest.hint main(int argc, char* argv) try if (argc != 2) throw 0; CORBA:ORB_var orb = CORBA:ORB_init(argc, argv); CORBA:Object_var obj = orb-string_to_object(argv1); if (CORBA:is_nil(obj) cerr Nil Time Reference endl; throw 0; Cobartest_var

44、tm = Cobartest:_narrow(obj); if (CORBA:is_nil(tm) cerr Nil Time Reference endl; throw 0; cout 结果 is Div(111,333) endl; catch (const CORBA:Exception&) cerr Exception endl; return 1; return 0;8、VC向导工程设置图1 Code Generation下选择“Run-time Library ”选择MultiThreaded DLL图2 增加预定义宏Preprocessor definitions:1)、_WIN

45、32_,2)、_x86_,3)、_WIN32_WINNT=0x0400,4)、_NT_,5)、_OSVERSION_=4,图3 增加工程依赖的库文件1、选择Link选项卡,Category选择Input,添加库模块:1)、ws2_32.lib 2)、mswsock.lib 3)、advapi32.lib4)、omniORB411_rt.lib 5)、omniDynamic411_rt.lib 6)、omnithread33_rt.lib输入的格式:ws2_32.lib mswsock.lib advapi32.lib omniORB411_rt.lib omniDynamic411_rt.li

46、b omnithread33_rt.lib (不是:omnithread32_rt.lib)每一个前后都需要加上:空格2、设置库模块的路径:$(OMNI_ROOT)/lib/x86_win32;3、testOrbClient工程设置与testOrbServer一致。9、编译测试程序编译testOrbServer工程,最后生成testOrbServer .exe文件;编译testOrbClient工程,最后生成testOrbClient.exe文件;10、测试程序把testOrbServer.exe和testOrbClient.exe 从各自的debug问价夹中得到,放到一个目录下面,并不需要一

47、定放到omniORB-4.1.1bin目录下,假设放在D:根目录下一、运行testOrbServer.exe二、运行testOrbClient.exe五、实验注意事项 1、环境变量的设置。六、实验报告要求1、书写程序的编写过程。2、附程序代码,包括IDL。3、粘贴程序的运行结果的图片。七、思考题1、如何使用omniNames.exe程序做命名服务器?实验六 CORBA之 命名服务一、实验目的OMG命名服务是最简单也是最基本的标准CORBA服务;通过实验掌握基于命名服务的CORBA对象定位。二、实验环境1、OmniORB2、Visual C+三、实验原理OMG命名服务是最简单也是最基本的标准CO

48、RBA服务。它提供从名称到对象引用的映射:给定一个名称,该服务返回一个存储在名称下对象引用。这点很像Internet的域名服务系统(DNS),将Internet的域名转换为IP地址。OMG命名服务和DNS执行简单的从名称到对应查找值的映射。命名服务将名称映射为对象引用。这种“名称-引用”的关系称为名称绑定。同一个对象引用可以使用不同的名称多次被存储,但每一个名称只能准确的确定一个引用。一个命名上下文(naming context)就是一个存储名称绑定的对象。也就是说,每一个上下文对象实现一个从名称到对象引用的映射表,这个表中的名称可以表示某个应用程序的对象引用,也可以表示命名服务中的另一个上下

49、文对象。这就意味着,如同文件系统,上下文就好像是一个有层次的表单:命名上下文相当于一个目录,用来存储指向其它目录和文件的名称,一个上下文和名称绑定的层次结构称为命名图。四、实验内容及步骤步骤:一、设置环境变量 0)、在IOR实验中设置的环境变量不改变,还需要加入一个环境变量1)、在“D:/omniORB-4.1.1/”目录下新建目录Omninames;2)、设置用户环境变量“OMNINAMES_LOGDIR = D:/omniORB-4.1.1/Omninames”。如果不设置这环境变量,在你做omniNames start 时候出现错误:Error: cannot create initia

50、l log file C:tempomninames-CHINA-E499FC10A.log:No such file or directory执行完 omniNames start 在Omninames文件夹下面会出现两个文件。二、配置命名服务执行D:/omniORB-4.1.1/sample.reg注册文件,开始运行 regedit打开HKEY_LOCAL_MACHINE/SOFTWARE/omniORB/InitRef 右击InitRef新建字符串值:加入类型为字符串键“”,键值为NameService=corbaname:(这里的 是你的

51、机器名)如果使用本机来测试,键值可以为NameService=corbaname:。这里的shane-120ef1cf3.是你的机器名。三、使用Cobra-omniORB IOR的工程文件testOrbServer工程文件,修改testOrbServer.cpp代码: #include /#include #include Cobartest.husing namespace std;/ 用它的话 #include 要变成 #include class Cobartest_impl:public virtual POA_Cobartestpublic : / virtual double Div(double a, double b, double& c); virtual double Div(double a, double b); /输出参数C 前面类型改变了:DoubleDouble& /如果不知道怎么写,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论