XX学院《开源中间件技术》实验指导书.docx

上传人:b****7 文档编号:9801362 上传时间:2023-02-06 格式:DOCX 页数:41 大小:279.71KB
下载 相关 举报
XX学院《开源中间件技术》实验指导书.docx_第1页
第1页 / 共41页
XX学院《开源中间件技术》实验指导书.docx_第2页
第2页 / 共41页
XX学院《开源中间件技术》实验指导书.docx_第3页
第3页 / 共41页
XX学院《开源中间件技术》实验指导书.docx_第4页
第4页 / 共41页
XX学院《开源中间件技术》实验指导书.docx_第5页
第5页 / 共41页
点击查看更多>>
下载资源
资源描述

XX学院《开源中间件技术》实验指导书.docx

《XX学院《开源中间件技术》实验指导书.docx》由会员分享,可在线阅读,更多相关《XX学院《开源中间件技术》实验指导书.docx(41页珍藏版)》请在冰豆网上搜索。

XX学院《开源中间件技术》实验指导书.docx

XX学院《开源中间件技术》实验指导书

《开源中间件技术》

实验指导书

XXXX

2012年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

实验五CORBA之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客户与服务器

一、实验目的

通过编写RPC的客户服务程序,并调用相应的函数,掌握RPC的原理和编写RPC程序的基本方法。

二、实验环境

VisualC++,Windows

三、实验原理

RPC其实也是种C/S的编程模式,类似C/SSocket编程模式,但要比它更高一层。

当在建立RPC服务以后,客户端的调用参数通过底层的RPC传输通道,可以是UDP,也可以是TCP(也即TI-RPC-无关性传输),并根据传输前所提供的目的地址及RPC上层应用程序号转至相应的RPCApplicationPorgrammeServer,且此时的客户端处于等待状态,直至收到应答或TimeOut超时信号。

四、实验内容及步骤

内容:

创建一个简单的客户机—服务器的分布式应用程序,实现客户应用程序在一个远程过程调用中,向服务器传递一个整数,经过服务器端求阶乘后,将最终结果从客户机端输出

步骤:

1开发接口,具体步骤包括:

1.1创建接口模板

在命令行方式下运行uuidgen工具,生成文件Rpctest.idl

D:

\ProgramFiles\MicrosoftVisualStudio\Common\Tools>uuidgen/I/oRpctest.idl

1.2替换Rpctest.idl中接口的定义,改为:

interfaceRpctest

{//远程过程调用的求阶乘函数

longRpcFactorial([in]longnVal);//出现[]的部分表示属性

voidShutdown(void);//终止服务器程序函数Shutdown必须要

}

1.3

使用文本编辑器编写ACF(属性配置文件),Rpctest.acf

[

auto_handle//相关属性

//implicit_handle(handle_tRpctest_IfHandle)

]

interfaceRpctest//注意:

要和idl中接口名称一致

{

}

1.4

使用MIDL编译器进行编译(注:

Rpctest.idl和Rpctest.acf都放Bin目录下)在命令行方式下运行MIDL.EXE,

D:

\ProgramFiles\MicrosoftVisualStudio\VC98\Bin>midlRpctest.idl

编译后生成文件Rpctest.h、Rpctest_c.c、Rpctest_s.c

2.开发服务器程序,具体步骤包括:

2.1VC环境下建一个项目Rpctestserver,把Rpctest.h、Rpctest.idl、Rpctest.acf和Rpctest_s.c放到这个项目下面,然后导入Rpctest.hRpctest_s.c,创建memstub.h(内存管理函数)

2.2编写远程阶乘调用函数:

新建文件Rpctest_s_f.c中实现;同时Rpctest_s_f.c中也包括了终止服务器程序函数Shutdown

2.3编写服务器源程序:

就是Rpctest_s.c一点都不改变。

添加一个新文件main.cpp里面放main()函数。

2.4在VC环境下编译和链接服务器端程序,最终生成Rpctestserver.exe文件

注:

在VC中Project->Settings->Link中添加两个RPC运行库:

rpcrt4.lib和rpcns4.lib

3.开发客户机程序,具体步骤包括:

3.1VC环境下建一个空项目Rpctestclient,然后添加qsorts.c,把Rpctest.h、Rpctest.idl、Rpctest.acf和Rpctest_c.c放到这个项目下面,

然后导入Rpctest.hRpctest_c.cmemstub.h

3.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远程调用程序

五、实验注意事项

1、要先运行服务器程序,再运行客户端程序

六、实验报告要求

1、书写程序的编写过程。

2、附程序代码,包括IDL。

3、粘贴程序的运行结果的图片。

七、思考题

1、如何利用RPC传递复合性数据结构?

实验二动态链接库

一、实验目的

掌握动态链接库的基本原理,并通过实验学习简单无GUI界面的动态链接库的编写和调试方法。

二、实验环境

VisualC++,Windows

三、实验原理

DLL文件即动态链接库文件,是一种可执行文件,它允许程序共享执行特殊任务所必需的代码和其他资源。

Windows提供的DLL文件中包含了允许基于Windows的程序在Windows环境下操作的许多函数和资源。

DLL多数情况下是带有DLL扩展名的文件,但也可能是EXE或其他扩展名。

它们向运行于Windows操作系统下的程序提供代码、数据或函数。

程序可根据DLL文件中的指令打开、启用、查询、禁用和关闭驱动程序。

DLL的全称是DynamicLinkLibrary,中文叫做“动态链接文件”。

在Windows操作系统中,DLL对于程序执行是非常重要的,因为程序在执行的时候,必须链接到DLL文件,才能够正确地运行。

而有些DLL文件可以被许多程序共用。

因此,程序设计人员可以利用DLL文件,使程序不至于太过巨大。

但是当安装的程序越来越多,DLL文件也就会越来越多,如果当你删除程序的时候,没有用的DLL文件没有被删除的话,久而久之就造成系统的负担了。

DLL是动态连接库。

使用动态连接库的一些好处是:

1.多个应用程序共享代码和数据:

比如Office软件的各个组成部分有相似的外观和功能,这就是通过共享动态连接库实现的。

2.在钩子程序过滤系统消息时必须使用动态连接库。

3.动态连接库以一种自然的方式将一个大的应用程序划分为几个小的模块,有利于小组内部成员的分工与合作。

而且,各个模块可以独立升级。

如果小组中的一个成员开发了一组实用例程,他就可以把这些例程放在一个动态连接库中,让小组的其他成员使用。

4.为了实现应用程序的国际化,往往需要使用动态连接库。

使用动态连接库可以将针对某一国家、语言的信息存放在其中。

对于不同的版本,使用不同的动态连接库。

在使用AppWizard生成应用程序时,我们可以指定资源文件使用的语言,这就是通过提供不同的动态连接库实现的。

VC++、C++Builder、Delphi都可以编写DLL文件。

VisualBasic5.0以上版本也可以编写一种特殊的DLL,即ActiveXDLL。

DLL不是独立运行的程序,它是某个程序的一个部分,它只能由所属的程序调用。

用户不能,也不需要打开它。

 用VC++编写动态链接有以下四种类型:

Win32DLL、MFC常规DLL(动态链接MFC)、MFC常规DLL(静态链接MFC)、MFC扩展DLL等,关于它们之间的区别,在此不一一介绍,可参阅相关文档。

本程序的编写为Win32DLL。

四、实验内容及步骤

1、创建DLL文件

1)打开visualc++6.0通过new创建一个win32Dynamic-linkLibary的工程,命名为FIRSTDLL

2)接着选择最后一个选项,让系统创建一些必要的文件

3)修改FIRSTDLL.cpp的代码。

4)编译、链接生成DLL

2、调用DLL

1)同样通过new创建一个工程,该工程为win32Consoleapplication,命名USEFIRSTDLL

2)在USEFIRSTDLL.cpp文件中编写如下代码。

4)编译、链接生成可执行程序。

voidmain(void)

{

typedefint(*pMax)(inta,intb);//定义指向和DLL中相同的函数原型指针

HINSTANCEHDLL;//定义句柄

pMaxMax;

HDLL=LoadLibrary("\FIRSTDLL.dll");

//加载动态链接库FIRSTDll.dll文件,注意指明FIRSTDLL的地址哦

if(HDLL==NULL)printf("cannotfindthedllfile");

Max=(pMax)GetProcAddress(HDLL,"Max");

//然后通过GetProcAddress()函数获取导入到应用程序中的函数指针

if(Max==NULL)printf("cannotfindtheMaxfuntion");

intA=Max(5,8);

printf("比较的结果为:

%d",A);

FreeLibrary(HDLL);//卸载MyDll.dll文件;

}

五、实验注意事项

1、DLL的导出函数的说明方法

2、使用DLL的方法

六、实验报告要求

1、书写程序的编写过程。

2、附程序代码。

3、粘贴程序的运行结果的图片。

七、思考题

1、如何在其他语言如JAVA中使用VisualC++编写的动态链接库?

实验三COM组件

一、实验目的

通过完成简单的进程内组件和客户程序,掌握COM的基本原理和进行COM组件编程的基本技术和方法。

二、实验环境

VisualC++、Windows

三、实验原理

COM是由Microsoft提出的组件标准,它不仅定义了组件程序之间进行交互的标准,并且也提供了组件程序运行所需的环境。

在COM标准中,一个组件程序也被称为一个模块,它可以是一个动态链接库,被称为进程内组件(in-processcomponent);也可以是一个可执行程序(即EXE程序),被称作进程外组件(out-of-processcomponent)。

一个组件程序可以包含一个或多个组件对象,因为COM是以对象为基本单元的模型,所以在程序与程序之间进行通信时,通信的双方应该是组件对象,也叫做COM对象,而组件程序(或称作COM程序)是提供COM对象的代码载体。

  COM对象不同于一般面向对象语言(如C++语言)中的对象概念,COM对象是建立在二进制可执行代码级的基础上,而C++等语言中的对象是建立在源代码级基础上的,因此COM对象是语言无关的。

这一特性使用不同编程语言开发的组件对象进行交互成为可能。

四、实验内容及步骤

实验内容

按照组件化程序设计方法,用VisualC++编写实现包含IAdd、IStr、二个接口的.dll组件,并利用客户端应用程序完成对各接口的充分测试。

 

接口

成员函数

IAdd

Add(longn1,longn2,long*pnVal)----------加法运算

Mul(longn1,longn2,long*pnVal)-----------乘法运算

IStr

Cat(BSTRs1,BSTRs2,BSTR*psVal)---字符串连接

步骤:

1.分析组件结构。

2.编写简单.dll组件。

3.逐步添加接口。

4.编写客户端应用程序进行测试。

⑴用regedit命令打开注册表

⑵注销操作:

RegSvr32/uc:

\XXXXX.dll

⑶注册操作:

RegSvr32c:

\XXXXX.dll

⑷在运行客户程序前,必须先注册组件程序。

简单Com实现步骤:

步骤1:

建立一个工作区(WorkSpace)。

在工作区中,新建一个ATL工程(Project)。

命名为SimpleCom1,并选择DLL方式

步骤2:

按默认进行。

选择DLL类型、不合并代理和存根代码、不支持MFC、不支持MTS

步骤3:

NewAtlObject...选择SimpleObject

步骤4:

输入名称和属性,属性按默认进行,也就是custom方式

步骤5:

增加两个方法。

Add(longn1,longn2,long*pnVal)

Div(VARIANTa,VARIANTb,VARIANT*pVal);

并完成代码

步骤6:

添加第二个接口IStr

步骤7:

打开头文件,手工增加类的派生关系和接口入口表,然后保存

步骤8:

增加方法

Cat(BSTRs1,BSTRs2,BSTR*psVal)

并完成代码

步骤9:

编译,注册

客户端实现步骤:

Main函数完成三个函数Div()、Add()和Cat()的调用:

五、实验注意事项

1、MIDL的编写方法。

2、组件DLL中导出函数的编写。

3、类厂的编写方法。

六、实验报告要求

1、书写程序的编写过程。

2、附程序代码,包括IDL。

3、粘贴程序的运行结果的图片。

七、思考题

1、如何编写进程外组件?

实验四DCOM

一、实验目的

通过完成简单的进程内组件和客户程序,掌握DCOM的基本原理和进行DCOM组件编程的基本技术和方法。

二、实验环境

VisualC++、Windows

三、实验原理

DCOM代表的是“Distributed(分布式)”COM。

在前面的部分中,我们已经讲解了运行在同一部计算机的COM客户和服务器。

在这一部分,我们将讨论如何将它扩展到DCOM的领域和分布式计算。

  COM和DCOM的区别

  COM和DCOM应用之间的大部分区别都被开发者隐藏起来。

客户和服务器端的程序可以一样地编写,而不管程序在哪里运行。

这个概念被称为本地/远程透明。

当然,分布和本地COM的内部工作是有着一些区别的。

本地的通信可通过许多的方式来完成,包括简单的Windows信息,而连接到一个远程的计算机需要一个全新的对象层和网络传输。

除了这些大的区别外,你的程序需要做的改动并不大。

与所有的COM通信一样,只有在客户请求一个服务器的接口时才会开始。

在DCOM中,客户端调用CoCreateInstanceEx(),传送服务器计算机的一个描述和请求一个类标识器(CLSID)和接口。

该请求由服务控制管理器处理(ServiceControlManager,SCM),它是Windows的一部分。

SCM负责在服务器计算机上创建和激活COM对象。

在DCOM中,SCM将尝试启动远程计算机上的服务器。

  一旦创建了远程的COM服务器,所有的调用将通过proxy和stub对象配置。

proxy和stub使用RPC(RemoteProcedureCalls,远程过程调用)进行通信,RPC处理所有网络交互。

在服务器端,stub对象负责配置,而客户端则由proxy负责。

  跨网络的数据传送由RPC负责。

实际上,DCOM使用一个扩展类型的RPC,称为对象RPC(ObjectRPC)或者ORPC。

RPC可以运行在多种不同的协议上,包括有TCP/IP,UDP,NetBEUI,NETBIOS和命名管道。

标准的RPC协议是UDP(用户数据报协议)。

UDP是一个无连接的协议,看来与DCOM这种面向连接的系统配合并不是一个好主意。

不过这并不是一个问题,DCOM自动负责管理连接。

四、实验内容及步骤

内容

1、编写服务器端程序。

2、编写代理/存根DLL

3、编写简单的测试客户程序。

步骤

1、建立服务器程序:

1.1用VC++建立一个名为Test的workspace。

1.2在workspace中加入一个新的工程,选ATLCOMAppwizard项,命名为AddSub,下一步server类型选service(EXE)。

1.3添加组件对象:

打开Insert\NewATLObject,选SimpleObject,在names下shortname填AddSubCom,如果需要可以将interface改为IAdd(默认为IAddSub),在attributes下interface选custom,则该com组件接口将从IUnknown继承,如果aggregation选yes,则该组件可被聚合。

1.4a)组件接口函数的定义:

打开AddSub.idl文件,在接口IAdd下填写接口函数的声明:

interfaceIAdd:

IUnknown{

//接口函数的声明

HRESULTAddMatrix([in]intlength,

[in,size_is(length)]double*pfMatrix,

[in,size_is(length)]double*psMatrix,

[out,size_is(length)]double*prMatrix);

};

另一种方法是:

在workspace的class标签中,右键点击IAdd,选AddMethod,在对话框中添加。

b)组件接口函数的声明(如果在上一步中使用第二种方法添加,则无需此步):

打开AddSubCom.h文件,在类声明后面加入:

STDMETHOD(AddMatrix)(intlength,double*pfMatrix,double*psMatrix,double*prMatrix);

c)组件接口函数的实现:

打开AddSubCom.cpp文件,加入接口方法的实现函数:

STDMETHODIMPCAddSubCom:

:

AddMatrix(intlength,double*pfMatrix,double*psMatrix,double*prMatrix)

{

//函数功能

returnNOERROR;

}

1.5组件注册:

一般地,编译完成服务器自动注册;如果使用编译好的服务器,注册方法是用/Register参数执行服务器程序,如C:

\MyDir\AddSub/RegServer,解注册用/UnregServer(参见AddSub.cpp源码)。

2、建立代理/存根DLL

2.1建立一个新的工程命名为PSAddSub,工程选Win32Dynamic-LinkLibrary,其余默认。

2.2在工程中新建一个文本文件PSAddSub.def,内容如下:

LIBRARYPSAddSub

EXPORTS

DllGetClassObjectPRIVATE

DllCanUnloadNowPRIVATE

DllRegisterServerPRIVATE

DllUnregisterServerPRIVATE

GetProxyDllInfoPRIVATE

2.3将AddSub.idl生成的AddSub.h、AddSub_i.c、AddSub_p.c、dlldata.c四个文件加入工程。

2.4project\setting\c/c++中category\Preprocessordefinitions加入REGISTER_PROXY_DLL,_WIN32_DCOM,project\setting\link中Object/librarymodules加入rpcndr.librpcns4.librpcrt4.lib,然后编译,生成PSAddSub.dll。

2.5注册dll:

c:

\MyDir>regsvr32PSAddSub.dll;也可以用VC++的tools\RegisterControl。

3、建立客户程序

在客户端主程序中加入如下程序段:

#include

#include

#include

#include"../Server/Server.h"

intmain()

{

CString*pszHostName=newCString("125.223.8.77");

//char*pszHostName="125.223.8.77";

//pszHostName=;

HRESULThResult;

//PrepareCOMforuse

hResult=CoInitialize(NULL);//初始化COM库

if(FAILED(hResult)){

return0;

}

IClassFactory*pClf;

IUnknown*pIUnknown;

LPOLESTRlpszHostname=pszHostName->AllocSysString();

COSERVERINFOServerInfo={0,lpszHostname,NULL,0};//获取服务器信息

hResult=CoGetClassObject(CLSID_AddSubCom,

CLSCTX_SERVER,

&ServerInfo,

IID_IClassFactory,

(void**)&pClf);//创建类厂

if(FAILED(hResult)){

return0;

}

hResult=pClf->CreateInstance(NULL,

IID_IUnkno

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1