最近想学习一下Web底层机制,也不知道从哪里开始看起。 找了一本差不多的书《Java网络高级编程》,看到RMI这一块,发现自己看不明白,就网络上各处寻找资料,鼓捣了一晚上,终于明白了怎么回事。发出来显摆OR丢人一下
。
大神们手下留情啊。 上次被弄了一个新手帖,悲剧死了。。。
Java Remote Method Invocation ( RMI -- Java远程方法调用
)
允许您使用
Java
编写分布式对象
RMI(远程方法调用)的组成
一个正常工作的RMI
系统由下面几个部分组成:
1、
远程服务的接口定义
2、
远程服务接口的具体实现
3、
桩(Stub
)和框架(
Skeleton
)文件
4、
一个运行远程服务的服务器
5、
一个RMI
命名服务,它允许客户端去发现这个远程服务
6、
类文件的提供者(一个HTTP
或者
FTP
服务器)
7、
一个需要这个远程服务的客户端程序
RMI(远程方法调用)的工作原理
RMI系统结构,在客户端和服务器端都有几层结构。
方法调用从客户对象经占位程序(Stub)
、远程引用层
(Remote Reference Layer)
和传输层(
Transport Layer
)向下,传递给主机,然后再次经传 输层,向上穿过远程调用层和骨干网(
Skeleton
),到达服务器对象。 占位程序扮演着远程服务器对象的代理的角色,使该对象可被客户激活。 远程引用层处理语义、管理单一或多重对象的通信,决定调用是应发往一个服务器还是多个。传输层管理实际的连接,并且追追踪可以接受方法调用的远程对象。服务器端的骨干网完成对服务器对象实际的方法调用,并获取返回值。返回值向下经远程引用层、服务器端的传输层传递回客户端,再向上经传输层和远程调用层返回。最后,占位程序获得返回值。
要完成以上步骤需要有以下几个步骤:
1、
生成一个远程接口
2、
实现远程对象(
服务器端程序
)
3、
编写服务器程序 、注册远程对象、启动远程对象
4、
编写客户程序
RMI的实现原理
1、
调用者(Client
)以通常方法
obj.invoke()
调用一个本地接口的远程实现类的实例
2、
顾客Stub
的功能把有关的远程调用参数封装为一个消息包(数据包)或者一组消息包,第一步调用访问的远程服务的地址(
rmi://localhost:1099/
)、对象(
obj
)、调用方法(
invoke()
)及其参数都包含在这条消息中
3、
调用者(Client
)本地
RMI Runtime
将这条消息发送给对应的服务器地址(
rmi://localhost:1099/
)
RMI Runtime
(
rmi
协议基于
tcp/ip
协议),服务器端
RMI Runtime
寻找绑定远程对象的进程(某个
javaw.exe
),然后调用这个进程中绑定的远程对象的指定方法,执行之后,将执行结果返回给调用者(
Client
)(其中的运行涉及到序列化和反序列化,因此为了平台兼容性每个有关
java
类都最好实现序列化。经常看到有人压制序列号警告而不是添加一个序列化
ID
。。。)
4、
调用者(Client
)
RMI Runtime
接受到返回的结果,然后将此结果反序列化并且返回到调用方法。
在以上回避了一个重要问题,即Client
怎么知道并调用
Server
上某个远程对象呢?这里就用到了命名服务。命名服务(
Name Service
)是分布式系统基本的公共服务。
Java
远程方法调用利用
RMI
机制提供命名服务。命名是给一个对象起一个名字,也就是就是说把名字绑定(
binding
)到该对象上,也就是以
Key|Value
的
mapping
存储在
RMI
上的,它的目的就是用人们容易理解的名字代替计算机中人们不易理解的存储表示对象。
Client
通过
Server
上的某个
key(String
类型
)
获取指定的
value(Object
类型
)
,这个
value
是一种实现类,这个实现类所实现的规范或者说是接口本地一定要有,然后本地调用的就是这个接口的远程实现了。由此可见,
RMI
的命名服务在
RMI
服务器端为
RMI
服务器提供者提供发布
RMI
服务对象的功能,在
RMI
客户端为
RMI
客户提供搜索远程
RMI
服务对象的功能
实例
1、远程接口
该接口定义了一个方法,用于提供远程服务
package net.sulin.test.rmi;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Upper extends Remote {
public String UpperString(String param)
throws RemoteException ;
}
|
2、
实现远程对象(
服务器端程序
)
用来创建一个
Upper对象,然后由远程客户端获取
package net.sulin.test.rmi;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class UpperImpl extends UnicastRemoteObject
implements Upper {
private static final long
serialVersionUID = 806571139035814115L;
protected UpperImpl() throws RemoteException {
super();
}
@Override
public String UpperString(String param)
throws RemoteException {
System.out.println("remote invoking successfully");
return param.toUpperCase();
}
}
|
3
、编写服务器程序 、注册远程对象、启动远程对象
代码:远程对象的注册类 该类应该在服务器端执行 执行之后, 该机器将变为RMI
服务器 客户端可以通过正确的
url
来访问;服务器上的远程对象;执行对外报露的方法
package net.sulin.test.rmi;
import java.rmi.Naming;
public class ServerBad {
public static void main(String[] args) throws Exception {
UpperImpl upp = new UpperImpl();
Naming.rebind("upper", upp);
System.out.println("Bind successfully");
}
}
|
运行该服务端代码后,将会注册一个远程服务对象
4
、编写客户程序
代码首先获取一个远程对象,然后如同本地调用一样,调用远程对象中的方法。
package net.sulin.test.rmi;
import java.rmi.Naming;
public class Client {
public static void main(String[] args) throws Exception {
Upper upper = (Upper) Naming.lookup("upper");
System.out.println(upper.UpperString("aaaaaa"));
}
}
|
这些之后,还不行的。
还需要做下列的一系列事情:
1、 使用
rmic
编译一个能被
RMI
服务使用的
clsss
文件
这个clsss
就是需要远程调用的类。在这里就是
UpperImpl.class
了
记住,先javac UpperImpl.java
、 再
rmic UpperImpl
2、 然后就是启动
rmi
服务了。 打开控制台,输入
start rmiregistry
,再按回车就
OK
了
最后一步就是启动服务类
ServerBad
了
这里是最容易出错的,参见下面注意事项。
注意:
如果提示找不到Stub
类,这个需要用下面的命令来运行
java.exe
-Djava.rmi.server.codebase
=file:/
*_stub.class
/
ServerBad
*_stub.clss就是第一步生成的
*_stub.class
的文件绝对路径
3、
启动你的客户端程序吧
你难道就不好奇我的服务类为什么是
Server
Bad,
因为我感觉这种方法太麻烦了。。。
还有一种更简单的方法,使用
java.rmi.registry
.Registry动态注册一个绑定指定端口(可选,默认
1099
)的
rmi
服务。
服务端的类可以换为
package net.sulin.test.rmi;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class Server {
public static void main(String[] args) throws Exception {
bind();
}
public static Registry createRegistry() throws Exception {
Registry registry = null;
final int port = 2222;
registry = LocateRegistry.createRegistry(port);
return registry;
}
public static void bind() throws Exception{
Registry registry = null;
registry = createRegistry();
Upper upp = new UpperImpl();
registry.bind("upper", upp);
System.out.println("My RMI Bind Successfully");
}
}
|
以上部分是单一的 Client-Server
的远程方法调用
还有一对多的Client(one)-Server(many)
的远程方法调用,即服务器端有多个,不但可以分散请求压力,还可以防止服务器出现故障导致的一系列问题
还有一种Client/Server
的远程方法调用,即一个网络点即可以是
Client
也可以是
Server
。
还有服务器链的远程方法调用,即Client-Server-Server......
。
Client
请求的第一个
Server
不能完成全部工作,就可以设置服务器链,利用多个
Server
同步响应一个调用请求
后面这几种都是基于上面的单一远程方法调用。很容易理解的
下来看到第三章CORBA
了
、 本来是看网络通信底层的,怎么书上讲到分布式开发上了。。。
分享到:
相关推荐
RMI(Remote Method Invocation,远程方法调用)是Java平台中的一个重要特性,它允许Java对象在不同的Java虚拟机之间进行通信,实现分布式计算。RMI是Java开发分布式应用程序的基础,尤其在构建分布式服务和微服务...
Java RMI(Remote Method Invocation,远程方法调用)是Java平台提供的一种分布式计算技术,它允许Java对象在不同的网络环境中进行交互,就像它们在同一个进程内一样。RMI是Java在分布式系统领域的核心特性,极大地...
根据提供的文件信息,我们可以深入探讨Java RMI(Java Remote Method Invocation)的相关知识点,包括其概念、原理、体系结构以及一个具体的示例。 ### RMI的概念 RMI是一种Java技术,它允许开发者创建分布式应用...
Java RMI(远程方法调用)是Java编程语言中的一项核心技术,自JDK 1.1版本起就被引入,用于构建分布式系统。RMI允许Java对象在不同的Java虚拟机(JVMs)之间进行交互,仿佛这些对象是在同一台机器上一样。这种技术的...
### Java RMI (Remote Method Invocation) 概念与实践 #### 一、Java RMI简介 Java RMI(Remote Method Invocation)是一种允许调用不同Java虚拟机(JVM)上方法的机制。这些JVM可能位于不同的机器上,也可能在同一...
Java Remote Method Invocation (RMI) 是Java平台提供的一种分布式计算技术,它允许Java对象在不同的网络环境中进行交互,实现远程方法调用。本压缩包文件"rmi-code"包含了一个完整的RMI测试代码示例,适合在Linux和...
Spring Remote Method Invocation(RMI)是Java平台上的一个远程对象调用框架,它允许一个Java对象在一台机器上执行,并且被另一台机器上的客户端调用。在这个"SpringRMI小例子"中,我们将深入探讨如何利用Spring...
Java RMI(Remote Method Invocation,远程方法调用)是Java平台提供的一种分布式计算技术,它允许在不同的Java虚拟机之间进行远程对象的调用。RMI使得开发者可以像调用本地对象一样调用网络上的对象,极大地简化了...
在Spring框架中,远程方法调用(Remote Method Invocation, RMI)是一种使应用程序能够通过网络调用另一个JVM上的对象方法的技术。RMI是Java平台的一部分,它允许开发者创建分布式应用,使得对象可以像调用本地方法...
Java RMI (Remote Method Invocation) 是一种用于在Java应用程序之间进行远程通信的技术。为了提高RMI通信的安全性,我们可以使用SSL (Secure Sockets Layer) 或其后继者TLS (Transport Layer Security) 进行加密。...
**RMI原理及应用详解** 远程方法调用(Remote Method Invocation,简称RMI)是Java平台提供的一种分布式计算技术,允许在不同的Java虚拟机(JVM)之间进行对象方法的透明调用。RMI的核心思想是使Java对象能够跨越...
Spring RMI(Remote Method Invocation)是Java平台上的远程方法调用技术,结合Spring框架的特性,使得在分布式系统中调用远程服务变得更加便捷。在这个简单的例子中,我们将深入理解Spring RMI的工作原理以及如何...
分布式实验报告 RMI.docx 本实验报告主要介绍了 Java RMI(Remote Method Invocation,远程方法调用)的基本概念和实现步骤。RMI 是一种分布式对象通讯机制,允许运行在一个 Java 虚拟机的对象调用运行在另一个 ...
**远程方法调用(Remote Method Invocation,RMI)** RMI是Java平台中用于实现分布式计算的一种机制。它允许一个Java对象在某台计算机上执行方法,而该方法的调用者位于另一台计算机上。这使得开发者可以构建分布式...
Java RMI(Remote Method Invocation,远程方法调用)是Java平台提供的一种分布式计算技术,它允许在不同的Java虚拟机之间进行方法调用,仿佛这些对象都在同一台机器上。RMI是Java网络编程的重要组成部分,使得开发...
Ehcache RMI Replicated Cluster 是一种分布式缓存解决方案,它使用远程方法调用(RMI)技术在多个节点之间复制数据,以实现高可用性和负载均衡。在大型分布式系统中,缓存是提高应用程序性能的关键组件,因为它可以...
本项目实例是基于RMI技术实现的一个服务器端程序,名为"RMIServer",提供了远程服务的接口和实现,下面将详细介绍RMI的基本概念、工作原理以及如何通过这个项目实例来学习和应用RMI。 1. **RMI基本概念**: - **...
**基于JAVA RMI的聊天室** Java Remote Method Invocation(RMI)是Java平台提供的一种用于在分布式环境中调用远程对象的方法。在这个“基于JAVA RMI的聊天室”项目中,开发者利用RMI技术构建了一个简单的多用户...
RMI(Remote Method Invocation,远程方法调用)是Java平台中的一个重要特性,它允许Java对象在不同的网络节点之间进行通信,实现分布式计算。这个“RMI入门好例子”旨在帮助初学者理解并实践RMI的基本原理和操作...