浅谈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的交互应该有一些简单的认识了,很多 ...
随机推荐
- 使用Spring Boot操作Hive JDBC时,启动时报出错误:NoSuchMethodError: org.eclipse.jetty.servlet.ServletMapping.setDef
使用Spring Boot操作Hive JDBC时,启动时报出错误:NoSuchMethodError: org.eclipse.jetty.servlet.ServletMapping.setDef ...
- solr学习四(关于性能的杂知识)
将所有只用于搜索的,而不需要作为结果的field(特别是一些比较大的field)的stored设置为false 比如我们在solr中index了一篇word,对于这篇word,我们只需要这篇文章的下载 ...
- 【转】每天一个linux命令目录
原文网址:http://www.cnblogs.com/peida/archive/2012/12/05/2803591.html 开始详细系统的学习linux常用命令,坚持每天一个命令,所以这个系列 ...
- php实现Facebook风格的 time ago函数
php实现Facebook风格的 time ago函数 非常好用,只要把里面的英文替换成中文就行了 英文函数代码如下: <?php function nicetime($date) { if(e ...
- 【python】实例-把两个无规则的序列连接成一个序列,并删除重复的元素,新序列按照升序排序
list_one=[3,6,2,17,7,33,11,7] list_two=[1,2,3,7,4,2,17,33,11] list_new=list_one+list_two list=[] i=0 ...
- 判断真实ip
#region 获取真实ip /// <summary> /// 获取真实ip /// </summary> ...
- js代码的执行顺序及运算
代码执行顺序:从上往下,一行一行的执行(也叫一个模块一个模块的执行) 变量的提升(它不是变量的功能,而是浏览器的功能) js代码如何执行? js代码执行前,浏览器会给他一个全局的环境 叫window, ...
- Flex 学习
Flex案例一: <html> <head> <meta http-equiv="Content-Type" content="text/h ...
- windows,linux下SVN实现自动更新WEB目录
通过SVN进行版本库管理,每次提交后,都要在SVN服务器更新最新上传的版本到WEB目录进行同步.操作比较烦琐,而且效率也低.使用SVN钩子脚本进行WEB目录同步,可很好的解决这方面的问题.由于测试机器 ...
- 通过优化在UE4中实现良好性能和高质量视觉效果
转自:http://gad.qq.com/program/translateview/7160166 译者:赵菁菁(轩语轩缘) 审校:李笑达(DDBC4747) 对于任何追求UE4性能最佳.同时又想 ...