分布式对象技术RMI

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

5.1 RMI结构 结构
RMI 实现结构可以分为三层: 实现结构可以分为三层: 1. Stub/Skeleton层 层 2. 远程引用层 3. 传输层 Stub Sub/Skeleton层实现传输数据的调度和 层实现传输数据的调度和 反调度机制。 反调度机制。调度就是把数据或对象 转换成字节流, 转换成字节流,反调度则把字节流转 换成数据或对象。 换成数据或对象。 远程引用层定义了RMI连接的调用语义 连接的调用语义 远程引用层定义了 即如何调用远程对象的方法。 即如何调用远程对象的方法。Java远程 远程 方法协议(Java Remote Method Protocol) 方法协议 使用java.rmi.server.RemoteRef 使用 Skeleton 客户调用远程对象 方法 远程对象
JavaRMI 第2例: 例 分为以下四个步骤 1. 创建远程接口及声明远程方法(HelloInterface.java) 创建远程接口及声明远程方法( ) 2. 实现远程接口及远程方法(继承 实现远程接口及远程方法(继承UnicastRemoteObject)(Hello.java) ) 3. 启动 启动RMI注册服务,并注册远程对象(HelloServer.java) 注册服务, 注册服务 并注册远程对象( ) 4. 客户端查找远程对象,并调用远程方法(HelloClient) 客户端查找远程对象,并调用远程方法( ) 5. 执行程序:启动服务 执行程序:启动服务HelloServer;运行客户端 ;运行客户端HelloClient进行调用 进行调用
1. 定义远程接口(服务接口 定义远程接口 服务接口) 服务接口
import java.rmi.Remote; import java.rmi.RemoteException; /** * RMI调用对象接口定义 * @author 王华东 */ public interface InterfaceService extends Remote { /**远程服务对象所必须实现的方法 * 所有的远程调用的方法,必须声明throws RemoteException * */ Object service(Object obj) throws RemoteException; }
2. 实现远程接口
/** * RMI服务对象接口实现 此对象将被 服务对象接口实现,此对象将被 服务对象接口实现 此对象将被RMI服务器导出做为远程服务对象 服务器导出做为远程服务对象 * @author 王华东 */ // 远程接口必须继承 远程接口必须继承java.rmi.server.RemoteServer或它的子类 或它的子类 public class ImpService extends java.rmi.server.UnicastRemoteObject 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(); } }4 Nhomakorabea 客户机代码
import java.rmi.*; /** * RMI调用客户端 调用客户端 * @author 王华东 */ public class RmiClient { public static void main(String[] args) { int listerPort=9911;//设置 设置RMI监听器在 监听器在9911端口 端口,1099是默认端口 设置 监听器在 端口 是默认端口 String serverIP="localhost";//监听的 监听的IP 监听的 String serviceObjName="service";//要导出的服务对象名字 要导出的服务对象名字 try { //查找服务器上的服务对象 查找服务器上的服务对象 InterfaceService stub = (InterfaceService) Naming.lookup("rmi://"+serverIP+":"+listerPort+"/"+serviceObjName); for(int i=0;i<10;i++){ //调用对象的服务方法 调用对象的服务方法 Object response = stub.service("请说话 请说话....."+i); 请说话 System.out.println("RMI服务器应答 + response.toString()); 服务器应答:" 服务器应答 Thread.sleep(1000); } } catch (Exception e) { System.err.println("Client exception: " + e.toString()); e.printStackTrace(); }}}
3. 启动 启动RMI服务器 服务器
import java.rmi.*; import java.rmi.registry.*; /** * 启动 启动RMI服务器 导出服务对象 服务器,导出服务对象 服务器 * @author 王华东 */ public class StartRMIServer { /**启动方法 启动方法*/ 启动方法 public static void main(String[] args) { int listerPort=9911; //设置 设置RMI监听器在 监听器在9911端口 设置 监听器在 端口 String serverIP="localhost"; //监听的 监听的IP 监听的 String serviceObjName="service"; //要导出的服务对象名字 要导出的服务对象名字 try { LocateRegistry.createRegistry(listerPort); //设置 设置RMI服务器监听端口 设置 服务器监听端口 ImpService.setLog(System.out); //设置日志对象 打印到控制台 设置日志对象,打印到控制台 设置日志对象 ImpService remoteObj = new ImpService(); //创建导出的对象 绑定服务 创建导出的对象, 创建导出的对象 Naming.rebind("rmi://"+serverIP+":"+listerPort+"/"+serviceObjName, remoteObj); System.out.println("RMI启动在 启动在"+serverIP+": "+listerPort+" 服务名为 "+serviceObjName); 服务名为: 启动在 } catch (Exception e) { System.err.println("Server exception: " + e.toString()); e.printStackTrace(); } } }
1. 创建远程接口及声明远程方法(HelloInterface.java) 创建远程接口及声明远程方法( )
import java.rmi.*; /** * 远程接口必须扩展接口 远程接口必须扩展接口java.rmi.Remote */ public interface HelloInterface extends Remote { /** * 远程接口方法必须抛 出 java.rmi.RemoteException */ public String say() throws RemoteException; }
5.2.1 构建服务器程序
创建一个远程接口时,必须遵守下列规则: 创建一个远程接口时,必须遵守下列规则: 1. 远程接口必须为 远程接口必须为public 2. 远程接口必须继承 远程接口必须继承java.rmi.Remote 3. 除应用程序本身有关异常外,远程接口中的每个方法都必须在自己的 除应用程序本身有关异常外, throws中声明 中声明java.rmi.RemoteException 中声明 4. 作为参数或返回值传递的一个远程对象,必须声明为远程接口,不可 作为参数或返回值传递的一个远程对象,必须声明为远程接口, 声明为实现类。 声明为实现类。
2. 实现远程接口及远程方法(继承 实现远程接口及远程方法(继承UnicastRemoteObject)(Hello.java) )
import java.rmi.*; import java.rmi.server.*; /** * 扩展了 扩展了UnicastRemoteObject类,并实现远程接口 HelloInterface 类 */ public class Hello extends UnicastRemoteObject implements HelloInterface { private String message; /** * 必须定义构造方法,即使是默认构造方法,也必须把它明确地写出来,因为它必须抛出出 必须定义构造方法,即使是默认构造方法,也必须把它明确地写出来,因为它必须抛出出RemoteException异常 异常 */ public Hello(String msg) throws RemoteException { message = msg; } /** * 远程接口方法的实现 */ public String say() throws RemoteException { System.out.println("Called by HelloClient"); return message; } }
远层引用层
远层引用层
TCP RMI结构图 结构图
TCP
传输层实现字节流的传输,一般采用 传输层实现字节流的传输,一般采用TCP/IP或UDP 或
5.2 采用 采用RMI开发客户机 服务器应用程序步骤: 开发客户机/服务器应用程序步骤 开发客户机 服务器应用程序步骤:
1. 定义远程接口 2. 实现这个远程接口 3. 生成stub(客户代理 和skeleton(实体 生成 客户代理)和 实体) 客户代理 实体 4. 编写使用远程对象的客户程序 5. 启动注册表并登记远程对象 6. 运行服务器和客户程序
分布式对象技术JavaRMI 分布式对象技术
RMI(Remote Method Invocation)是基于 是基于Java技术的分布式编程模型, 技术的分布式编程模型, 是基于 技术的分布式编程模型 程序提供远程访问服务。 为Java程序提供远程访问服务。 程序提供远程访问服务 通过RMI允许对象在不同的 允许对象在不同的Java虚拟机 虚拟机(Java Virtual Machine)之间进行通信。 之间进行通信。 通过 允许对象在不同的 虚拟机 之间进行通信 套接字(Socket): : 套接字 Java支持基本的通信机制 支持基本的通信机制Socket通信,通信方式灵活能满足大多数应用的通信要求。 通信, 支持基本的通信机制 通信 通信方式灵活能满足大多数应用的通信要求。 但使用Socket技术需要客户端和服务端都对传递的消息编码和解码。 技术需要客户端和服务端都对传递的消息编码和解码。 但使用 技术需要客户端和服务端都对传递的消息编码和解码 JMS与RMI的区别:采用 与 的区别: 服务, 的区别 采用JMS服务,对象是在物理上异步地从网络的某个 服务 对象是在物理上异步地从网络的某个JVM上 上 直接移动到另一个JMV上。而RMI对象是绑定在本地 上 对象是绑定在本地JVM中,只有方法参数和返回 直接移动到另一个 对象是绑定在本地 中 值是通过网络传送的。 值是通过网络传送的。
相关文档
最新文档