《分布式对象技术.ppt》由会员分享,可在线阅读,更多相关《分布式对象技术.ppt(15页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、现在学习的是第1页,共15页RMI技术应用技术应用现在学习的是第2页,共15页1. RMI结构结构RMI 实现结构可以分为三层:实现结构可以分为三层:Stub/Skeleton层层远程引用层远程引用层1. 传输层传输层客户调用远程对象客户调用远程对象方法方法Stub远层引用层远层引用层TCP远程对象远程对象Skeleton远层引用层远层引用层TCPRMI结构图结构图Sub/Skeleton层实现传输数据的调度和层实现传输数据的调度和反调度机制。调度就是把数据或对象反调度机制。调度就是把数据或对象转换成字节流,反调度则把字节流转转换成字节流,反调度则把字节流转换成数据或对象。换成数据或对象。远程
2、引用层定义了远程引用层定义了RMI连接的调用语义连接的调用语义即如何调用远程对象的方法。即如何调用远程对象的方法。Java远程远程方法协议方法协议(Java Remote Method Protocol)使用使用java.rmi.server.RemoteRef传输层实现字节流的传输,一般采用传输层实现字节流的传输,一般采用TCP或或UDPJava Remote Messaging Protocol 现在学习的是第3页,共15页2. 采用采用RMI开发客户机开发客户机/服务器应用程序步骤:服务器应用程序步骤:定义远程接口定义远程接口实现这个远程接口实现这个远程接口生成生成stub(桩桩/客户代
3、理客户代理)和和skeleton(骨架骨架/实体实体)编写使用远程对象的客户程序编写使用远程对象的客户程序启动注册表并登记远程对象启动注册表并登记远程对象1. 运行服务器和客户程序运行服务器和客户程序现在学习的是第4页,共15页2.1 构建服务器程序构建服务器程序创建一个远程接口时,必须遵守下列规则:创建一个远程接口时,必须遵守下列规则:远程接口必须为远程接口必须为public远程接口必须继承远程接口必须继承java.rmi.Remote除应用程序本身有关异常外,远程接口中的每个方法都必须在自己的除应用程序本身有关异常外,远程接口中的每个方法都必须在自己的 throws中声明中声明java.r
4、mi.RemoteException作为参数或返回值传递的一个远程对象,必须声明为远程接口,不可作为参数或返回值传递的一个远程对象,必须声明为远程接口,不可 声明为实现类。声明为实现类。现在学习的是第5页,共15页1. 定义远程接口定义远程接口(服务接口服务接口)import java.rmi.Remote;import java.rmi.RemoteException;/* RMI调用对象接口定义* author 王华东*/public interface InterfaceService extends Remote /*远程服务对象所必须实现的方法* 所有的远程调用的方法,必须声明thr
5、ows RemoteException* */Object service(Object obj) throws RemoteException;现在学习的是第6页,共15页2. 实现远程接口实现远程接口/* RMI服务对象接口实现服务对象接口实现, 此对象将被此对象将被RMI服务器导出做为远程服务对象服务器导出做为远程服务对象* author 王华东王华东*/ 远程接口必须继承远程接口必须继承java.rmi.server.RemoteServer或它的子类或它的子类public class ImpService extends java.rmi.server.UnicastRemoteOb
6、ject implements InterfaceService public ImpService() throws java.rmi.RemoteException super();/* 客户端将要调用的方法示例客户端将要调用的方法示例*/public Object service(Object obj) System.out.println(RMI客户机请求客户机请求: +obj);return System.currentTimeMillis()/1000 + : + obj.toString(); 现在学习的是第7页,共15页3. 启动启动RMI服务器服务器import java.r
7、mi.*;import java.rmi.registry.*;/* 启动启动RMI服务器服务器,导出服务对象导出服务对象* author 王华东王华东*/public class StartRMIServer /*启动方法启动方法*/public static void main(String args) int listerPort=9911; /设置设置RMI监听器在监听器在9911端口端口String serverIP=localhost; /监听的监听的IPString serviceObjName=service; /要导出的服务对象名字要导出的服务对象名字try LocateRe
8、gistry.createRegistry(listerPort); /设置设置RMI服务器监听端口服务器监听端口ImpService.setLog(System.out); /设置日志对象设置日志对象,打印到控制台打印到控制台ImpService remoteObj = new ImpService(); /创建导出的对象创建导出的对象, 绑定服务绑定服务Naming.rebind(rmi:/+serverIP+:+listerPort+/+serviceObjName, remoteObj);System.out.println(RMI启动在启动在+serverIP+: +listerPo
9、rt+ 服务名为服务名为: +serviceObjName); catch (Exception e) System.err.println(Server exception: + e.toString();e.printStackTrace();现在学习的是第8页,共15页4. 客户机代码客户机代码import java.rmi.*;/* RMI调用客户端调用客户端* author 王华东王华东*/public class RmiClient public static void main(String args) int listerPort=9911;/设置设置RMI监听器在监听器在99
10、11端口端口,1099是默认端口是默认端口String serverIP=localhost;/监听的监听的IPString serviceObjName=service;/要导出的服务对象名字要导出的服务对象名字try /查找服务器上的服务对象查找服务器上的服务对象InterfaceService stub = (InterfaceService)Naming.lookup(rmi:/+serverIP+:+listerPort+/+serviceObjName);for(int i=0;i10;i+)/调用对象的服务方法调用对象的服务方法Object response = stub.ser
11、vice(请说话请说话.+i);System.out.println(RMI服务器应答服务器应答: + response.toString();Thread.sleep(1000); catch (Exception e) System.err.println(Client exception: + e.toString();e.printStackTrace(); 现在学习的是第9页,共15页JavaRMI 第第2例:例:分为以下四个步骤分为以下四个步骤1. 创建远程接口及声明远程方法(创建远程接口及声明远程方法(HelloInterface.java)2. 实现远程接口及远程方法(继承实现
12、远程接口及远程方法(继承UnicastRemoteObject)(Hello.java)3. 启动启动RMI注册服务,并注册远程对象(注册服务,并注册远程对象(HelloServer.java)4. 客户端查找远程对象,并调用远程方法(客户端查找远程对象,并调用远程方法(HelloClient)5. 执行程序:启动服务执行程序:启动服务HelloServer;运行客户端;运行客户端HelloClient进行调用进行调用现在学习的是第10页,共15页import java.rmi.*; /* * 远程接口必须扩展接口远程接口必须扩展接口java.rmi.Remote */ public inte
13、rface HelloInterface extends Remote /* * 远程接口方法必须抛出远程接口方法必须抛出 java.rmi.RemoteException */ public String say() throws RemoteException; 1. 创建远程接口及声明远程方法(创建远程接口及声明远程方法(HelloInterface.java)现在学习的是第11页,共15页2. 实现远程接口及远程方法(继承实现远程接口及远程方法(继承UnicastRemoteObject)(Hello.java) import java.rmi.*; import java.rmi.s
14、erver.*; /* * 扩展了扩展了UnicastRemoteObject类,并实现远程接口类,并实现远程接口 HelloInterface */ public class Hello extends UnicastRemoteObject implements HelloInterface private String message; /* * 必须定义构造方法,即使是默认构造方法,也必须把它明确地写出来,因为它必须抛出出必须定义构造方法,即使是默认构造方法,也必须把它明确地写出来,因为它必须抛出出RemoteException异常异常 */ public Hello(String m
15、sg) throws RemoteException message = msg; /* * 远程接口方法的实现远程接口方法的实现 */ public String say() throws RemoteException System.out.println(Called by HelloClient); return message; 现在学习的是第12页,共15页3. 启动启动RMI注册服务,并注册远程对象(注册服务,并注册远程对象(HelloServer.java)import java.rmi.Naming; import java.rmi.registry.LocateRegist
16、ry; public class HelloServer /* * 启动启动 RMI 注册服务并进行对象注册注册服务并进行对象注册 */ public static void main(String argv) try /启动启动RMI注册服务,指定端口为注册服务,指定端口为1099(1099为默认端口)为默认端口) /也可以通过命令也可以通过命令 java_home/bin/rmiregistry 1099启动启动 /而且用命令而且用命令rmiregistry启动注册服务还必须事先用启动注册服务还必须事先用RMIC生成一个生成一个stub类为它所用类为它所用 LocateRegistry.c
17、reateRegistry(1099); /创建远程对象的一个或多个实例,下面是创建远程对象的一个或多个实例,下面是hello对象对象 /可以用不同名字注册不同的实例可以用不同名字注册不同的实例 HelloInterface hello = new Hello(Hello, world!); /把把hello注册到注册到RMI注册服务器上,命名为注册服务器上,命名为Hello Naming.rebind(Hello, hello); /如果要把如果要把hello实例注册到另一台启动了实例注册到另一台启动了RMI注册服务的机器上注册服务的机器上 /Naming.rebind(/192.168.1
18、.105:1099/Hello,hello); System.out.println(Hello Server is ready.); catch (Exception e) System.out.println(Hello Server failed: + e); 现在学习的是第13页,共15页4. 客户端查找远程对象,并调用远程方法(客户端查找远程对象,并调用远程方法(HelloClient)import java.rmi.Naming; public class HelloClient /* * 查找远程对象并调用远程方法查找远程对象并调用远程方法 */ public static vo
19、id main(String argv) try HelloInterface hello = (HelloInterface) Naming.lookup(Hello); /如果要从另一台启动了如果要从另一台启动了RMI注册服务的机器上查找注册服务的机器上查找hello实例实例 /HelloInterface hello = (HelloInterface)Naming.lookup(/192.168.1.105:1099/Hello); /调用远程方法调用远程方法 System.out.println(hello.say(); catch (Exception e) System.out.
20、println(HelloClient exception: + e); 5. 执行程序:启动服务执行程序:启动服务HelloServer;运行客户端;运行客户端HelloClient进行调用进行调用现在学习的是第14页,共15页 Java RMI-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现在学习的是第15页,共15页