浅谈RMI的特点及作用
RMI:远程方法调用(Remote Method Invocation)
扩展:RPC与RMI的区别
1:方法调用方式不同:
RMI中是通过在客户端的Stub对象作为远程接口进行远程方法的调用。每个远程方法都具有方法签名。如果一个方法在服务器上执行,但是没有相匹配的签名被添加到这个远程接口(stub)上,那么这个新方法就不能被RMI客户方所调用。
RPC中是通过网络服务协议向远程主机发送请求,请求包含了一个参数集和一个文本值,通常形成“classname.methodname(参数集)”的形式。RPC远程主机就去搜索与之相匹配的类和方法,找到后就执行方法并把结果编码,通过网络协议发回。
2:适用语言范围不同:
RMI只用于Java;
RPC是网络服务协议,与操作系统和语言无关。
3:调用结果的返回形式不同:
Java是面向对象的,所以RMI的调用结果可以是对象类型或者基本数据类型;
RMI的结果统一由外部数据表示 (External Data Representation, XDR) 语言表示,这种语言抽象了字节序类和数据类型结构之间的差异。
RMI代码示例:
Config.java
package shenzhou;
public class Client {
   private String name;
   private String hostURL;
   private String obj;
   public Client(String name){
      this.name = name;
      hostURL = "rmi://" + Config.SERVER_IP + ":" + Config.PORT + "/";
      this.obj = Config.OBJECT_NAME;
   }
   public void callRMethod(){
      try{
         RMethod rm = (RMethod) java.rmi.Naming.lookup(hostURL + obj);
         String result = rm.sayHello(name);
         System.out.println(result);
      } catch (Exception e) {
         e.printStackTrace();
      }
   }
   public static void main(String[] args) {
      Client c1 = new Client("Monica");
      c1.callRMethod();
      Client c2 = new Client("Joy");
      c2.callRMethod();
      Client c3 = new Client("Ross");
      c3.callRMethod();
      Client c4 = new Client("Chandler");
      c4.callRMethod();
   }
}
RMethod.java
package shenzhou; import java.rmi.Remote;
import java.rmi.RemoteException; public interface RMethod extends Remote {
String sayHello(String name) throws RemoteException;
} RMethodImpl.java
package shenzhou; import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject; public class RMethodImpl extends UnicastRemoteObject implements RMethod { protected RMethodImpl() throws RemoteException {
super();
// TODO Auto-generated constructor stub
} @Override
public String sayHello(String name) throws RemoteException {
// TODO Auto-generated method stub
System.out.println("Client-" + name + ": invoking \" sayHello \"");
return "Hello " + name + "\n this is a message from Remote Method";
} } Client.java
package shenzhou;
public class Client {
   private String name;
   private String hostURL;
   private String obj;
   public Client(String name){
      this.name = name;
      hostURL = "rmi://" + Config.SERVER_IP + ":" + Config.PORT + "/";
      this.obj = Config.OBJECT_NAME;
   }
   public void callRMethod(){
      try{
         RMethod rm = (RMethod) java.rmi.Naming.lookup(hostURL + obj);
         String result = rm.sayHello(name);
         System.out.println(result);
      } catch (Exception e) {
         e.printStackTrace();
      }
   }
   public static void main(String[] args) {
      Client c1 = new Client("Monica");
      c1.callRMethod();
      Client c2 = new Client("Joy");
      c2.callRMethod();
      Client c3 = new Client("Ross");
      c3.callRMethod();
      Client c4 = new Client("Chandler");
      c4.callRMethod();
   }
}
Server.java
package shenzhou; import java.rmi.RMISecurityManager;
import java.rmi.registry.LocateRegistry; public class Server { public static void main(String[] args) {
new Server();
} public Server() {
if (null == System.getSecurityManager()) {
System.setSecurityManager(new RMISecurityManager());
}
try {
try {
LocateRegistry.createRegistry(Config.PORT);
} catch (java.rmi.server.ExportException ex) {
System.out.println("Register the port failed:\n" + ex.getMessage());
}
RMethod rm = new RMethodImpl();
String objAddr = "rmi://" + Config.SERVER_IP
+ ":" + Config.PORT
+ "/" + Config.OBJECT_NAME;
java.rmi.Naming.rebind(objAddr, rm);
System.out.println("Server is running...");
} catch (Exception e) {
System.out.println("Server startup failed!");
e.printStackTrace();
}
} } 小结:Server端:rebind 绑定(url + 调用对象);
Client端:lookup 根据 url 获取远程调用 作用:使用本地方法一样调用远程方法
浅谈RMI的特点及作用的更多相关文章
- oracle: 浅谈sqlnet.ora文件的作用,及SQLNET.AUTHENTICATION_SERVICES设置
		
关于sqlnet.ora的说明: *****************************************************FROM ORACLE11G DOCS*********** ...
 - 浅谈springboot自动配置原理
		
前言 springboot自动配置关键在于@SpringBootApplication注解,启动类之所以作为项目启动的入口,也是因为该注解,下面浅谈下这个注解的作用和实现原理 @SpringBootA ...
 - 浅谈线程池(中):独立线程池的作用及IO线程池
		
原文地址:http://blog.zhaojie.me/2009/07/thread-pool-2-dedicate-pool-and-io-pool.html 在上一篇文章中,我们简单讨论了线程池的 ...
 - 浅谈线程池(上):线程池的作用及CLR线程池
		
原文地址:http://blog.zhaojie.me/2009/07/thread-pool-1-the-goal-and-the-clr-thread-pool.html 线程池是一个重要的概念. ...
 - sql之浅谈视图的作用
		
[数据库]☆★sql之浅谈视图的作用 在一个项目的实际开发过程中牵涉到复杂业务的时候,我们不可避免的须要使用中间表来进行数据连接,有的同学就说了,我能够採用Hibernate进行主外键进行关联啊?多对 ...
 - 浅谈Java的反射机制和作用
		
浅谈Java的反射机制和作用 作者:Java大师 欢迎转载,转载请注明出处 很多刚学Java反射的同学可能对反射技术一头雾水,为什么要学习反射,学习反射有什么作用,不用反射,通过new也能创建用户对象 ...
 - 浅谈 LayoutInflater
		
浅谈 LayoutInflater 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/View 文中如有纰漏,欢迎大家留言指出. 在 Android 的 ...
 - iOS开发之浅谈MVVM的架构设计与团队协作
		
今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...
 - 浅谈Hybrid技术的设计与实现第三弹——落地篇
		
前言 接上文:(阅读本文前,建议阅读前两篇文章先) 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 根据之前的介绍,大家对前端与Native的交互应该有一些简单的认识了,很多 ...
 
随机推荐
- hangfire docker-compose 运行
			
hangfire 是一款基于.net 的任务调度系统 docker-compose 文件 version: '3' services: hangfire: image: direktchark/han ...
 - dbt 的知识文档管理
			
dbt 支持docs的管理,可以方便进行分享,以及大家的可视化工作 有一篇文档讲的特别好分析了知识共享,知识管理的重要性(dbt 对应公司的ceo) https://blog.fishtownanal ...
 - smarty学习——缓存
			
存被用来保存一个文档的输出从而加速display()或fetch()函数的执行.如果一个函数被加进缓存,那么实际输出的内容将用缓存来代替. 缓存可让事物非常快速的执行,特别是带有长计算时间的模板.一旦 ...
 - log4net保存到数据库系列一:WebConfig中配置log4net
			
园子里面有很多关于log4net保存到数据库的帖子,但是要动手操作还是比较不易,从头开始学习log4net数据库日志 一.WebConfig中配置log4net 二.独立配置文件中配置log4net ...
 - 【MVC】Model的使用
			
1,Model的职责: Model只负责与数据处理相关的工作. 2,开发Model的基本观念 采用ORM信息访问技术开发 ORM是将结构化的关系型数据,映射成面向对象模型.对于EF来说,就是关系型数据 ...
 - 【转】Android开源项目(非组件)
			
原文网址:http://blog.csdn.net/feizhixuan46789/article/details/9252887 学习开发一个有效的途径就是借鉴成熟的案例作为学习的对象,下面为大家推 ...
 - Oracle RAC 归档 与 非归档 切换
			
Oracle 的生产库都是启动在归档模式下,RAC下归档非归档的切换和单实例也是一样的,都是在MOUNT模式下执行ALTER DATABASE ARCHIVELOG/NOARCHIVELOG;命令. ...
 - QString 和char数组转换(转)
			
在qt开发过程中经常遇到QString类和char数组进行转换,在此记录一下: QString->char数组 1 2 3 QString str="12fff"; QByt ...
 - JSP+JavaBean+Servlet技术(MVC模型)
			
一,Servlet开发用户在浏览器中输入一个网址并回车,浏览器会向服务器发送一个HTTP请求.服务器端程序接受这个请求,并对请求进行处理,然后发送一个回应.浏览器收到回应,再把回应的内容显示出来.这种 ...
 - Lucene.Net 入门级实例  浅显易懂。。。
			
Lucene.Net 阅读目录 开始 Lucene简介 效果图 Demo文件说明 简单使用 重点类的说明 存在问题 调整后 Lucene.Net博文与资源下载 做过站内搜索的朋友应该对Lucene.N ...