RMI(远程接口调用)
2015-11-17 12:17
246 查看
<转自> http://gongjiayun.iteye.com/blog/906159
1. RMI的原理:
RMI系统结构,在客户端和服务器端都有几层结构。
方法调用从客户对象经占位程序(Stub)、远程引用层(Remote Reference Layer)和传输层(Transport Layer)向下,传递给主机,然后再次经传 输层,向上穿过远程调用层和骨干网(Skeleton),到达服务器对象。 占位程序扮演着远程服务器对象的代理的角色,使该对象可被客户激活。 远程引用层处理语义、管理单一或多重对象的通信,决定调用是应发往一个服务器还是多个。传输层管理实际的连接,并且追追踪可以接受方法调用的远程对象。服务器端的骨干网完成对服务器对象实际的方法调用,并获取返回值。返回值向下经远程引用层、服务器端的传输层传递回客户端,再向上经传输层和远程调用层返回。最后,占位程序获得返回值。
2. RMI(远程方法调用)的组成
一个正常工作的RMI系统由下面几个部分组成:
•远程服务的接口定义
•远程服务接口的具体实现
•桩(Stub)和框架(Skeleton)文件
•一个运行远程服务的服务器
•一个RMI命名服务,它允许客户端去发现这个远程服务
•类文件的提供者(一个HTTP或者FTP服务器)
•一个需要这个远程服务的客户端程序
3. RMI的实现
(1) 服务器端的实现
编写一个远程接口
(2) 编写远程接口的实现
(3) 编写服务器端程序
(4) 编写客户端程序
1. RMI的原理:
RMI系统结构,在客户端和服务器端都有几层结构。
方法调用从客户对象经占位程序(Stub)、远程引用层(Remote Reference Layer)和传输层(Transport Layer)向下,传递给主机,然后再次经传 输层,向上穿过远程调用层和骨干网(Skeleton),到达服务器对象。 占位程序扮演着远程服务器对象的代理的角色,使该对象可被客户激活。 远程引用层处理语义、管理单一或多重对象的通信,决定调用是应发往一个服务器还是多个。传输层管理实际的连接,并且追追踪可以接受方法调用的远程对象。服务器端的骨干网完成对服务器对象实际的方法调用,并获取返回值。返回值向下经远程引用层、服务器端的传输层传递回客户端,再向上经传输层和远程调用层返回。最后,占位程序获得返回值。
2. RMI(远程方法调用)的组成
一个正常工作的RMI系统由下面几个部分组成:
•远程服务的接口定义
•远程服务接口的具体实现
•桩(Stub)和框架(Skeleton)文件
•一个运行远程服务的服务器
•一个RMI命名服务,它允许客户端去发现这个远程服务
•类文件的提供者(一个HTTP或者FTP服务器)
•一个需要这个远程服务的客户端程序
3. RMI的实现
(1) 服务器端的实现
编写一个远程接口
package com.gjy.rmi.service; import java.rmi.Remote; import java.rmi.RemoteException; public interface AddServer extends Remote { public int AddNumbers(int firstnumber,int secondnumber) throws RemoteException; }
(2) 编写远程接口的实现
package com.gjy.rmi.service; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; public class AddServerImpl extends UnicastRemoteObject implements AddServer { public AddServerImpl() throws RemoteException { super(); } public int AddNumbers(int firstnumber,int secondnumber) throws RemoteException { return firstnumber + secondnumber; } }
(3) 编写服务器端程序
package com.gjy.rmi.service; import java.rmi.Naming; import java.rmi.registry.LocateRegistry; public class RmiServer { /** * 启动 RMI 注册服务并进行对象注册 */ public static void main(String[] argv) { try { //启动RMI注册服务,指定端口为1099 (1099为默认端口) //也可以通过命令 $java_home/bin/rmiregistry 1099启动 //这里用这种方式避免了再打开一个DOS窗口 //而且用命令rmiregistry启动注册服务还必须事先用RMIC生成一个占位程序(stub类)为它所用 LocateRegistry.createRegistry(1099); //创建远程对象的一个或多个实例,下面是hello对象 //可以用不同名字注册不同的实例 AddServer add = new AddServerImpl(); //把hello注册到RMI注册服务器上,命名为Hello Naming.rebind("Hello", add); //如果要把hello实例注册到另一台启动了RMI注册服务的机器上 //Naming.rebind("//192.168.1.105:1099/Hello",hello); System.out.println("Hello Server is ready."); } catch (Exception e) { System.out.println("Hello Server failed: " + e); } } }
(4) 编写客户端程序
package com.gjy.rmi.client; import java.net.MalformedURLException; import java.rmi.Naming; import java.rmi.NotBoundException; import java.rmi.RemoteException; import com.gjy.rmi.service.AddServer; public class RmiClient { public static void main(String args[]) throws RemoteException, MalformedURLException, NotBoundException { String url="rmi://127.0.0.1/Hello"; AddServer add; add = (AddServer)Naming.lookup(url); int result=0; for (int i =0;i<10;i++){ result = add.AddNumbers(10,i); System.out.println(result); } } }
相关文章推荐
- 过滤器详解
- 《神经网络和深度学习》系列文章十三:反向传播背后的四个基本等式
- 《神经网络和深度学习》系列文章十二:Hadamard积,s⊙t
- 关于 错误: 编码GBK的不可映射字符 的解决方法
- swift之闭包(closure)
- 《神经网络和深度学习》系列文章十一:关于损失函数的两个假设
- 《神经网络和深度学习》系列文章十:[热身]一个基于矩阵的快速计算神经网络输出的方法
- ol元素及相关属性:type, start, value, 和reversed
- hihocoder 1249(2015ACM/ICPC北京)
- 冒泡排序
- hihocoder 1249(2015ACM/ICPC北京)
- 滴滴快车奖励政策,高峰奖励,翻倍奖励,按成交率,指派单数分级(11月9日~11月13日)
- 《神经网络和深度学习》系列文章九:反向传播算法是如何工作的
- 《神经网络和深度学习》系列文章八:迈向深度学习
- HTML <ol> 标签的 type 属性
- web.xml中提示错误The content of element type "web-app" must match
- ExpandableListView实现简单分组功能
- 使用CreateRemoteThread把代码远程注入指定exe执行
- phpstorm 10 初体验
- 《神经网络和深度学习》系列文章七:实现我们的神经网络来分类数字(下)