《分布式对象技术讲稿.ppt》由会员分享,可在线阅读,更多相关《分布式对象技术讲稿.ppt(15页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、分布式对象技术分布式对象技术第一页,讲稿共十五页哦RMI技术应用技术应用第二页,讲稿共十五页哦1.RMI结构结构RMI 实现结构可以分为三层:实现结构可以分为三层:1.Stub/Skeleton层层2.远程引用层远程引用层3.传输层传输层客户调用远程对象客户调用远程对象方法方法Stub远层引用层远层引用层TCP远程对象远程对象Skeleton远层引用层远层引用层TCPRMI结构图结构图Sub/Skeleton层实现传输数据的调度和层实现传输数据的调度和反调度机制。调度就是把数据或对象反调度机制。调度就是把数据或对象转换成字节流,反调度则把字节流转转换成字节流,反调度则把字节流转换成数据或对象。
2、换成数据或对象。远程引用层定义了远程引用层定义了RMI连接的调用语义连接的调用语义即如何调用远程对象的方法。即如何调用远程对象的方法。Java远程远程方法协议方法协议(Java Remote Method Protocol)使用使用java.rmi.server.RemoteRef传输层实现字节流的传输,一般采用传输层实现字节流的传输,一般采用TCP或或UDPJavaRemoteMessagingProtocol 第三页,讲稿共十五页哦2.采用采用RMI开发客户机开发客户机/服务器应用程序步骤:服务器应用程序步骤:1.定义远程接口定义远程接口2.实现这个远程接口实现这个远程接口3.生成生成st
3、ub(桩桩/客户代理客户代理)和和skeleton(骨架骨架/实体实体)4.编写使用远程对象的客户程序编写使用远程对象的客户程序5.启动注册表并登记远程对象启动注册表并登记远程对象6.运行服务器和客户程序运行服务器和客户程序第四页,讲稿共十五页哦2.1构建服务器程序构建服务器程序创建一个远程接口时,必须遵守下列规则:创建一个远程接口时,必须遵守下列规则:1.远程接口必须为远程接口必须为public2.远程接口必须继承远程接口必须继承java.rmi.Remote3.除应用程序本身有关异常外,远程接口中的每个方法都必须在自己的除应用程序本身有关异常外,远程接口中的每个方法都必须在自己的throw
4、s中声明中声明java.rmi.RemoteException4.作为参数或返回值传递的一个远程对象,必须声明为远程接口,不可作为参数或返回值传递的一个远程对象,必须声明为远程接口,不可声明为实现类。声明为实现类。第五页,讲稿共十五页哦1.定义远程接口定义远程接口(服务接口服务接口)import java.rmi.Remote;import java.rmi.RemoteException;/*RMI调用对象接口定义*author 王华东*/public interface InterfaceService extends Remote/*远程服务对象所必须实现的方法*所有的远程调用的方法,必
5、须声明throws RemoteException*/Object service(Object obj)throws RemoteException;第六页,讲稿共十五页哦2.实现远程接口实现远程接口/*RMI服务对象接口实现服务对象接口实现,此对象将被此对象将被RMI服务器导出做为远程服务对象服务器导出做为远程服务对象*author王华东王华东*/远程接口必须继承远程接口必须继承java.rmi.server.RemoteServer或它的子类或它的子类publicclassImpServiceextendsjava.rmi.server.UnicastRemoteObjectimplem
6、entsInterfaceServicepublicImpService()throwsjava.rmi.RemoteExceptionsuper();/*客户端将要调用的方法示例客户端将要调用的方法示例*/publicObjectservice(Objectobj)System.out.println(RMI客户机请求客户机请求:+obj);returnSystem.currentTimeMillis()/1000+:+obj.toString();第七页,讲稿共十五页哦3.启动启动RMI服务器服务器importjava.rmi.*;importjava.rmi.registry.*;/*启
7、动启动RMI服务器服务器,导出服务对象导出服务对象*author王华东王华东*/publicclassStartRMIServer/*启动方法启动方法*/publicstaticvoidmain(Stringargs)intlisterPort=9911;/设置设置RMI监听器在监听器在9911端口端口StringserverIP=localhost;/监听的监听的IPStringserviceObjName=service;/要导出的服务对象名字要导出的服务对象名字tryLocateRegistry.createRegistry(listerPort);/设置设置RMI服务器监听端口服务器监
8、听端口ImpService.setLog(System.out);/设置日志对象设置日志对象,打印到控制台打印到控制台ImpServiceremoteObj=newImpService();/创建导出的对象创建导出的对象,绑定服务绑定服务Naming.rebind(rmi:/+serverIP+:+listerPort+/+serviceObjName,remoteObj);System.out.println(RMI启动在启动在+serverIP+:+listerPort+服务名为服务名为:+serviceObjName);catch(Exceptione)System.err.printl
9、n(Serverexception:+e.toString();e.printStackTrace();第八页,讲稿共十五页哦4.客户机代码客户机代码importjava.rmi.*;/*RMI调用客户端调用客户端*author王华东王华东*/publicclassRmiClientpublicstaticvoidmain(Stringargs)intlisterPort=9911;/设置设置RMI监听器在监听器在9911端口端口,1099是默认端口是默认端口StringserverIP=localhost;/监听的监听的IPStringserviceObjName=service;/要导出的
10、服务对象名字要导出的服务对象名字try/查找服务器上的服务对象查找服务器上的服务对象InterfaceServicestub=(InterfaceService)Naming.lookup(rmi:/+serverIP+:+listerPort+/+serviceObjName);for(inti=0;i10;i+)/调用对象的服务方法调用对象的服务方法Objectresponse=stub.service(请说话请说话.+i);System.out.println(RMI服务器应答服务器应答:+response.toString();Thread.sleep(1000);catch(Exce
11、ptione)System.err.println(Clientexception:+e.toString();e.printStackTrace();第九页,讲稿共十五页哦JavaRMI第第2例:例:分为以下四个步骤分为以下四个步骤1.创建远程接口及声明远程方法(创建远程接口及声明远程方法(HelloInterface.java)2.实现远程接口及远程方法(继承实现远程接口及远程方法(继承UnicastRemoteObject)(Hello.java)3.启动启动RMI注册服务,并注册远程对象(注册服务,并注册远程对象(HelloServer.java)4.客户端查找远程对象,并调用远程方法
12、(客户端查找远程对象,并调用远程方法(HelloClient)5.执行程序:启动服务执行程序:启动服务HelloServer;运行客户端;运行客户端HelloClient进行调用进行调用第十页,讲稿共十五页哦importjava.rmi.*;/*远程接口必须扩展接口远程接口必须扩展接口java.rmi.Remote*/publicinterfaceHelloInterfaceextendsRemote/*远程接口方法必须抛出远程接口方法必须抛出java.rmi.RemoteException*/publicStringsay()throwsRemoteException;1.创建远程接口及声明
13、远程方法(创建远程接口及声明远程方法(HelloInterface.java)第十一页,讲稿共十五页哦2.实现远程接口及远程方法(继承实现远程接口及远程方法(继承UnicastRemoteObject)(Hello.java)importjava.rmi.*;importjava.rmi.server.*;/*扩展了扩展了UnicastRemoteObject类,并实现远程接口类,并实现远程接口HelloInterface*/publicclassHelloextendsUnicastRemoteObjectimplementsHelloInterfaceprivateStringmessag
14、e;/*必须定义构造方法,即使是默认构造方法,也必须把它明确地写出来,因为它必须抛出出必须定义构造方法,即使是默认构造方法,也必须把它明确地写出来,因为它必须抛出出RemoteException异常异常*/publicHello(Stringmsg)throwsRemoteExceptionmessage=msg;/*远程接口方法的实现远程接口方法的实现*/publicStringsay()throwsRemoteExceptionSystem.out.println(CalledbyHelloClient);returnmessage;第十二页,讲稿共十五页哦3.启动启动RMI注册服务,并注
15、册远程对象(注册服务,并注册远程对象(HelloServer.java)importjava.rmi.Naming;importjava.rmi.registry.LocateRegistry;publicclassHelloServer /*启动启动RMI注册服务并进行对象注册注册服务并进行对象注册 */publicstaticvoidmain(Stringargv)try /启动启动RMI注册服务,指定端口为注册服务,指定端口为1099(1099为默认端口)为默认端口)/也可以通过命令也可以通过命令java_home/bin/rmiregistry1099启动启动 /而且用命令而且用命令r
16、miregistry启动注册服务还必须事先用启动注册服务还必须事先用RMIC生成一个生成一个stub类为它所用类为它所用 LocateRegistry.createRegistry(1099);/创建远程对象的一个或多个实例,下面是创建远程对象的一个或多个实例,下面是hello对象对象 /可以用不同名字注册不同的实例可以用不同名字注册不同的实例 HelloInterfacehello=newHello(Hello,world!);/把把hello注册到注册到RMI注册服务器上,命名为注册服务器上,命名为Hello Naming.rebind(Hello,hello);/如果要把如果要把hell
17、o实例注册到另一台启动了实例注册到另一台启动了RMI注册服务的机器上注册服务的机器上 /Naming.rebind(/192.168.1.105:1099/Hello,hello);System.out.println(HelloServerisready.);catch(Exceptione)System.out.println(HelloServerfailed:+e);第十三页,讲稿共十五页哦4.客户端查找远程对象,并调用远程方法(客户端查找远程对象,并调用远程方法(HelloClient)importjava.rmi.Naming;publicclassHelloClient /*查找
18、远程对象并调用远程方法查找远程对象并调用远程方法 */publicstaticvoidmain(Stringargv)try HelloInterfacehello=(HelloInterface)Naming.lookup(Hello);/如果要从另一台启动了如果要从另一台启动了RMI注册服务的机器上查找注册服务的机器上查找hello实例实例 /HelloInterfacehello=(HelloInterface)Naming.lookup(/192.168.1.105:1099/Hello);/调用远程方法调用远程方法 System.out.println(hello.say();cat
19、ch(Exceptione)System.out.println(HelloClientexception:+e);5.执行程序:启动服务执行程序:启动服务HelloServer;运行客户端;运行客户端HelloClient进行调用进行调用第十四页,讲稿共十五页哦JavaRMI-IIOP(由由IBM和和SUN共同开发共同开发)RMI-IIOP综合了综合了RMI的简单性和的简单性和CORBA的多语言性(兼容性),其次的多语言性(兼容性),其次RMI-IIOP克服了克服了RMI只能用于只能用于Java的缺点和的缺点和CORBA的复杂性(可以不用掌握的复杂性(可以不用掌握IDL)。)。CORBA和和RMI的差异:的差异:CORBA运行在运行在IIOP协议之上;协议之上;RMI使用使用JRMP协议。协议。CORBA是独立于语言的;是独立于语言的;RMI是纯粹是纯粹Java到到Java。RMI使用使用JNDI定位远程对象;定位远程对象;CORBA使用使用CosNaming。例子见附件:例子见附件:rmiiiop-Sun_example.rar第十五页,讲稿共十五页哦