- 浏览: 538150 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
landerson:
明显就有要求的嘛
ANDROID轻量级JSON序列化和反序列化[转] -
jimode2013:
很不错,就是需要这个方法
多个UIViewController使用addSubView,第二个 UIViewController 不响应旋转[转] -
w11h22j33:
...
[转]NSMutableArray中的自动释放对象让我郁闷了一整天 -
w11h22j33:
UILabel* label = [[UILabel a ...
Iphone开发 -
w11h22j33:
http://mobile.51cto.com/iphone- ...
获得通讯录中联系人的所有属性[转]
http://www.51testing.com/?uid-225738-action-viewspace-itemid-222961
今天刚好对Java RMI进行了简单的学习,也写了一个实例,简单总结一下吧。
1.RMI的基本体系结构
RMI的基本体系结构,概括起来说,由三个抽象层组成:
1、存根/框架层(Stubs/Skeletons Layer)
RMI为我们引入了两种特殊类型的对象,称为存根(Stub)和框架(Skeleton),它们组成了RMI的第一层。
在远程通信的时候,要利用TCP/IP协议,做很多底层数据的打包传输。运用Java分布式计算技术,我们先要把数据或者对象转换成字节流 (byte stream),便于网络传输,这个过程叫汇集(marshaling);当收到远程传来的字节流后,我们要把流信息转换成对象或者数据,这个过程叫解读 (unmarshaling),它与汇集刚好相反。
Stub和Skeleton层位于实际应用程序之下,建立在Proxy(代理)设计方案之上。Stub类的作用是远程服务器实现的代理的角色,Stub是客户方对象;Skeleton类用于帮助对象通过RMI链接与Stub通信,它从链路中读取方法调用的参数,向远程服务实现对象进行调用,接受返回值,然后再把返回值写回到Stub。
2、远程引用层(Remote Reference Layer)
远程引用层定义和支持着RMI连接的调用语义(semantics)。
RMI进行远程访问要用到JRMP(Java Remote Method Protocol,即Java远程方法协议),这一层提供专用于JRMP的RemoteRef对象,它位于java.rmi.server包内,代表着远程对象的一个句柄。RemoteRef使用远程引用来执行远程对象的一个远程方法调用。
3、传输层(Transport Layer)
传输层在JVM之间建立基于流的网络连接,并且负责设置和管理这些连接。这时候,RMI使用一种线级(wire-level)协议进行基于TCP/IP的连接,该协议就是Java远程方法协议(JRMP,即Java Remote Method Protocol)。
在JDK版本1.2开始,JRMP不再需要Skeleton,而是使用reflection来建立与远程服务的连接。为了生成Stub,我们须用rmic。
当前的RMI实现中,传输层建立在TCP/IP基础上,设计用于在客户和服务器之间建立一条连接(即使联网有障碍)。
2.RMI开发的基本步骤
我们使用RMI编写Client/Server模式(客户/服务器)应用程序,包括6个基本步骤:
1) 定义远程接口
2) 实现远程接口
3) 准备远程调用的服务器对象
4) 生成残根Stub(客户代理)和框架Skeleton(服务器实体)
5) 用rmiregistry找到远程对象
6) 运行测试RMI分布式应用
3.实现RMI的简单实例
下面的一些代码时根据网上的资料修改并在本机运行通过的。另外,推荐另一个很简单的例子,就在wikipedia上的这个吧,这个example也非常不错的:
http://en.wikipedia.org/wiki/Java_remote_method_invocation
贴自己的RMI简单实例代码吧:
import java.rmi.Remote;
import java.rmi.RemoteException;
/**
* @className: IHello
* @description: 定义一个远程接口,必须继承Remote接口,其中需要远程调用的方法必须抛出RemoteException异常
* @author: 笑遍世界
* @createTime: 2010-11-9 下午12:33:21
*/
public interface IHello extends Remote {
/**
* 简单的返回“Hello World!"字样
* @return 返回“Hello World!"字样
* @throws java.rmi.RemoteException
*/
public String helloWorld() throws RemoteException;
/**
* 一个简单的业务方法,根据传入的人名返回相应的问候语
* @param someBodyName 人名
* @return 返回相应的问候语
* @throws java.rmi.RemoteException
*/
public String sayHelloToSomeBody(String someBodyName) throws RemoteException;
}
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
/**
* @className: HelloImpl
* @description: RIM远程接口的实现
* @author: 笑遍世界
* @createTime: 2010-11-9 下午12:35:47
*/
public class HelloImpl extends UnicastRemoteObject implements IHello {
/**
*
*/
private static final long serialVersionUID = 1L;
/**
* 因为UnicastRemoteObject的构造方法抛出了RemoteException异常,因此这里默认的构造方法必须写,必须声明抛出RemoteException异常
*
* @throws RemoteException
*/
public HelloImpl() throws RemoteException {
}
/**
* 简单的返回“Hello World!"字样
*
* @return 返回“Hello World!"字样
* @throws java.rmi.RemoteException
*/
public String helloWorld() throws RemoteException {
return "Hello World!";
}
/**
* 一个简单的业务方法,根据传入的人名返回相应的问候语
*
* @param someBodyName 人名
* @return 返回相应的问候语
* @throws java.rmi.RemoteException
*/
public String sayHelloToSomeBody(String someBodyName) throws RemoteException {
return "你好," + someBodyName + "!";
}
}
import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
/**
* @className: HelloServer
* @description: 创建RMI注册表,启动RMI服务,并将远程对象注册到RMI注册表中。
* @author: 笑遍世界
* @createTime: 2010-11-9 下午12:41:39
*
*/
public class HelloServer {
public static void main(String args[]) {
try {
//创建一个远程对象
IHello rhello = new HelloImpl();
//本地主机上的远程对象注册表Registry的实例,并指定端口为8888,这一步必不可少(Java默认端口是1099),必不可缺的一步,缺少注册表创建,则无法绑定对象到远程注册表上
LocateRegistry.createRegistry(8888);
//把远程对象注册到RMI注册服务器上,并命名为RHello
//绑定的URL标准格式为:rmi://host:port/name(其中协议名可以省略,下面两种写法都是正确的)
Naming.bind("rmi://localhost:8888/RHello",rhello);
// Naming.bind("//localhost:8888/RHello",rhello);
System.out.println(">>>>>INFO:远程IHello对象绑定成功!");
} catch (RemoteException e) {
System.out.println("创建远程对象发生异常!");
e.printStackTrace();
} catch (AlreadyBoundException e) {
System.out.println("发生重复绑定对象异常!");
e.printStackTrace();
} catch (MalformedURLException e) {
System.out.println("发生URL畸形异常!");
e.printStackTrace();
}
}
}
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
/**
* @className: HelloClient
* @description: 客户端测试,在客户端调用远程对象上的远程方法,并返回结果。
* @author: 笑遍世界
* @createTime: 2010-11-9 下午01:27:02
*/
public class HelloClient {
public static void main(String args[]){
try {
//在RMI服务注册表中查找名称为RHello的对象,并调用其上的方法
IHello rhello =(IHello) Naming.lookup("rmi://localhost:8888/RHello");
System.out.println(rhello.helloWorld());
System.out.println(rhello.sayHelloToSomeBody("笑遍世界"));
} catch (NotBoundException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
发表评论
-
protobuf/json/xml/binary/Thrift数据交换[转]
2012-04-07 15:24 3148一条消息数据,用protobuf序列化后的大小是json ... -
[转]Ehcache Storage Options
2011-11-02 17:54 1380Ehcache Storage Options ... -
【转】Jackson 框架,轻易转换JSON
2011-11-02 09:36 1221Jackson可以轻松的将Java对象转换成json对象 ... -
【转】RAND算法,FIFO算法,LFU算法,LRU算法,OPT算法
2011-11-02 09:37 2911http://hi.baidu.com/ilovehaley/ ... -
【转】ehcache 让内容一直持久化在磁盘,防止异常丢失
2011-11-01 11:31 2171http://kangzye.blog.163.com/blo ... -
【转】java排序
2011-11-01 11:22 1051Java代码 package sor ... -
【转】使用 EhCache 关于临时目录的一个注意事项
2011-11-01 11:16 1239http://m.oschina.net/question ... -
Friendfeed的MySQL key/value存储【转】
2011-11-01 11:04 1219http://timyang.net/data/friendf ... -
Ehcache使用实例
2011-10-31 17:44 1039Ehcache使用实例(一) http://blog.csd ... -
Java日期格式化及其使用例子收集【转】
2011-07-18 16:10 9951 SimpleDateFormat担当重任,怎样格式化都 ... -
应用多线程执行Gets【转】
2011-05-22 11:35 1116http://www.androidres.com/index ... -
DefaultHttpClient进行BasicAuth重复请求的问题【转】
2011-05-22 11:32 3419其实一般的只要设置 ... -
HashMap遍历的两种方式[转]
2011-03-01 18:46 859第一种: Map map = new HashM ... -
Ant搞定全部开发流程【转】
2011-02-27 00:36 1166由于涉及到打包签名,所以在开始全部工作之前,我们先做好签 ... -
JAVA简单的加解密【转】
2011-02-23 23:20 1224http://blog.sina.com.cn/s/blog_ ... -
在Java中使用DES加密解密算法[转]
2011-02-23 23:19 1592import javax.crypto.*;import ... -
利用java反射机制执行类的方法[转]
2011-02-23 22:31 1515Reflection 是 Java 程序开发语言的特征之一, ...
相关推荐
Java RMI实例
在Java RMI实例中,我们通常会经历以下几个步骤: 1. **创建远程接口**:首先,我们需要定义一个远程接口,这个接口需要扩展`java.rmi.Remote`。远程接口中的所有方法都需要抛出`RemoteException`,这是因为远程...
在这个"JAVA RMI实现程序实例"中,我们将会探讨如何使用RMI实现一个简单的“Hello, World”示例,并已经在两台机器上进行了成功的测试。 首先,我们需要了解RMI的基本概念。RMI的核心思想是将对象的方法调用转化为...
JAVA分布式之RMI实例教程网络通信原理[收集].pdf
定义一个实现该接口并扩展了UnicastRemoteObject的类(服务端运行的服务类),这个类将实现给客户端调用的所用方法。 创建服务端供客户端调用的应用程序。 创建客户端RMI调用服务端的应用程序。 启动服务端,再...
3. **运行RMI实例** - **启动RMI注册表**:运行`rmiregistry`命令启动RMI注册表服务。 - **编译代码**:确保所有的Java源代码都已正确编译为字节码文件。 - **运行服务器**:使用`java`命令运行服务器端程序,这...
java rmi小例子源代码 ,运行Reg.java ,再执行Client客户端代码就能看效果。如果在不同jvm下执行,注意接口定义包路径客服端和服务端必须保持一致。 客服端包含文件有服务端接口的定义文件。
java rmi spring 使用实例,内涵服务端和客户端的源代码,测试可用。
**基于JAVA RMI的聊天室** ...综上所述,这个基于JAVA RMI的聊天室项目展示了如何利用RMI进行分布式编程,实现跨网络的实时通信。通过进一步开发和扩展,它可以成为一个功能丰富的多用户交流平台。
Java RMI(Remote Method Invocation,远程方法调用)是Java平台提供的一种用于分布式计算的技术,它允许Java对象在不同的 JVM(Java Virtual Machine)之间进行通信,实现跨网络的远程调用。通过RMI,开发者可以像...
根据提供的文件信息,我们可以深入探讨Java RMI(Java Remote Method Invocation)的相关知识点,包括其概念、原理、体系结构以及一个具体的示例。 ### RMI的概念 RMI是一种Java技术,它允许开发者创建分布式应用...
2. **实现远程接口**:然后,创建一个实现远程接口的类,该类通常需要继承自`java.rmi.Remote`接口,并且抛出`java.rmi.RemoteException`。在这个实现类中,你需要实现远程接口中的所有方法。 3. **创建并注册远程...
这意味着远程对象和其方法的参数及返回值必须实现`java.io.Serializable`接口,以便能够转换为字节流并在网络上传输。 5. ** stubs 和 skeletons**:在早期的Java RMI版本中,需要手动创建stubs(客户端代理)和...
这个实例将带你深入理解Java RMI的原理和实际应用。 一、RMI基本概念 1. 远程接口:远程接口定义了可以在远程对象上调用的方法。这些接口需要继承`java.rmi.Remote`接口,并声明可能会抛出`java.rmi....
`java.rmi.registry.Registry`是RMI提供的标准注册表实现。 4. ** Stub 和 Skeleton**:Stub是远程对象的代理,它位于客户端,负责将客户端的调用转换为网络消息发送给服务器;Skeleton是服务器端的代理,它接收...
这个简单的例子将引导我们了解如何利用Java RMI实现远程调用。 首先,我们要创建远程接口。在Java RMI中,远程接口是一个实现了`java.rmi.Remote`接口的Java接口。接口中声明的方法将在客户端调用,实际上会在...
在这个实例中,我们将详细探讨如何通过四个步骤来设置和使用一个简单的 Java RMI 应用。 1. 创建远程接口及声明远程方法 首先,我们需要定义一个远程接口 `HelloInterface`,它继承自 `java.rmi.Remote`。这个接口...
Java RMI(Remote Method Invocation)是Java平台提供的一种用于实现远程对象交互的技术。它允许一个Java对象调用另一个在不同 JVM(Java Virtual Machine)中的对象的方法,仿佛它们是在同一个进程中运行一样。本...