- 浏览: 82636 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
KeatsLee:
这篇文章是自己总结的吗?还是来自某本书,麻烦告知一下。觉得很经 ...
Java IO -
di1984HIT:
写的不错啊。
hive 实现多行转一行处理方法 -
di1984HIT:
大数据量分析。
hive海量数据--统计一年网站各个产品的UV
JAVA RMI 快速入门实例
本实例为参考多篇文章写就而成,网上及书上各类文章介绍如何使用RMI有多种实例可参考,譬如有:
1. 用命令rmiregistry启动RMI注册服务的
2. 同时创建存根(stub)和骨架(skeleton)的
3. 只创建存根类的的(jdk1.2以后版本)
4. 通过RemoteRef和rmi://协议字串方式的
5. 比较少讲到的用LocateRegistry直接在代码上启动RMI注册服务的。
以上描述并非明显分类,比如,你总是可以选择用rmiregistry或者代码LocateRegistry启动RMI注册服务
下面我将介绍一个完整的实例,让初学者能快速体验RMI的功用。
分为以下四个步骤
1. 创建远程接口及声明远程方法(HelloInterface.java)
2. 实现远程接口及远程方法(继承UnicastRemoteObject)(Hello.java)
3. 启动RMI注册服务,并注册远程对象(HelloServer.java)
4. 客户端查找远程对象,并调用远程方法(HelloClient)
5. 执行程序:启动服务HelloServer;运行客户端HelloClient进行调用
具体代码及对应步骤如下:
1. 创建远程接口及声明远程方法(HelloInterface.java)
java 代码
package com.unmi;
import java.rmi.*;
/**
* 远程接口必须扩展接口java.rmi.Remote
*/
public interface HelloInterface extends Remote
{
/**
* 远程接口方法必须抛出 java.rmi.RemoteException
*/
public String say() throws RemoteException;
}
2. 实现远程接口及远程方法(继承UnicastRemoteObject)Hello.java
java 代码
package com.unmi;
import java.rmi.*;
import java.rmi.server.*;
/**
* 扩展了UnicastRemoteObject类,并实现远程接口 HelloInterface
*/
public class Hello extends UnicastRemoteObject implements HelloInterface
{
private String message;
/**
* 必须定义构造方法,即使是默认构造方法,也必须把它明确地写出来,因为它必须抛出出RemoteException异常
*/
public Hello(String msg) throws RemoteException
{
message = msg;
}
/**
* 远程接口方法的实现
*/
public String say() throws RemoteException
{
System.out.println("Called by HelloClient");
return message;
}
}
3. 启动RMI注册服务,并注册远程对象(HelloServer.java)
java 代码
package com.unmi;
import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
public class HelloServer
{
/**
* 启动 RMI 注册服务并进行对象注册
*/
public static void main(String[] argv)
{
try
{
//启动RMI注册服务,指定端口为1099 (1099为默认端口)
//也可以通过命令 $java_home/bin/rmiregistry 1099启动
//这里用这种方式避免了再打开一个DOS窗口
//而且用命令rmiregistry启动注册服务还必须事先用RMIC生成一个stub类为它所用
LocateRegistry.createRegistry(1099);
//创建远程对象的一个或多个实例,下面是hello对象
//可以用不同名字注册不同的实例
HelloInterface hello = new Hello("Hello, world!");
//把hello注册到RMI注册服务器上,命名为Hello
Naming.rebind("Hello", hello);
//如果要把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. 客户端查找远程对象,并调用远程方法(HelloClient)
java 代码
package com.unmi;
import java.rmi.Naming;
public class HelloClient
{
/**
* 查找远程对象并调用远程方法
*/
public static void main(String[] argv)
{
try
{
HelloInterface hello = (HelloInterface) Naming.lookup("Hello");
//如果要从另一台启动了RMI注册服务的机器上查找hello实例
//HelloInterface hello = (HelloInterface)Naming.lookup("//192.168.1.105:1099/Hello");
//调用远程方法
System.out.println(hello.say());
}
catch (Exception e)
{
System.out.println("HelloClient exception: " + e);
}
}
}
5. 执行程序:启动服务HelloServer;运行客户端HelloClient进行调用
代码如何编译这里就不细讲
(1)打开一个Dos窗口执行命令 java com.unmi.HelloServer 启动服务HelloServer
E:workspaceTestRMIbin>java com.unmi.HelloServer
Hello Server is ready.
运行成功则可以看到 Hello Server is ready
(2)打开另一个Dos窗口执行命令 java com.unmi.HelloClient 运行客户端程序
E:workspaceTestRMIbin>java com.unmi.HelloClient
Hello, world!
调用成功则可以看到 Hello, world!
并且在启动服务端的窗口中看到紧跟 Hello Server is ready. 打印出
Called by HelloClient
如果您能一路顺畅的执行到这里,恭喜!您已度过了一个轻快的RMI之旅。
最后来个说明:
本实例中并没有用到JDK所带的命令 rmic 编译实现类得到存根(Stub)类,也没用命令 rmiregistry 命令来启动RMI注册服务。在启动 rmiregistry之前必须能让它加载到相应的stub类,这就是造成**_Stub 类找不到的原因。
如果只是按上面的代码,则服务程序 HelloServer 和客户端程序 HelloClient 都必须运行在本机(如此则RMI有何意义呢?);别急,只要修改HelloClient类,使用第二种形式的lookup查找语句,注释第一条 lookup语句,取消注释第二条lookup语句
//HelloInterface hello = (HelloInterface) Naming.lookup("Hello");
//如果要从另一台启动了RMI注册服务的机器上查找hello实例
HelloInterface hello = (HelloInterface)Naming.lookup("//192.168.1.105:1099/Hello");
其中的IP地址和端口号1099为 RMI 注册服务器的IP和端口号,这样你的HelloClient就可以在另一台机器运行了,当然HelloInterface类必须能找到(但也可指定参数- Djava.rmi.server.codebase从网络加载HelloInterface类)。lookup("Hello")默认为从本机 127.0.0.1的1099端口上查找Hello命令对象,如果第二条语句写成lookup("192.168.1.105/Hello")与原语句是同等的,因为默认端口号就是1099。
代码中 HelloServer 和 HelloClient 省略了设置安全管理器的过程 System.setSecurityManager(new RMISecurityManager()); ,如果设置的安全管理则必须编写相应的访问策略文件,并且在执行时指定参数
无论是启动服务端还是客户端都可以用参数 -Djava.rmi.server.codebase=http://unmi.blogcn.cn/bin 的形式,像JNP一样从网络上加载类,这样更方便于RMI客户端的部署,如RMI客户端是一个Applet
可以拿单独一台机器运行 rmiregistry (它需要能加载到相应的stub类,设置classpath)或用LocateRegistry.createRegistry(port),只作为 RMI远程对象的RMI集中注册的服务器,真正提供服务对象只往上注册,客户端只需从注册服务器上查找远程对象引用,然后调用远程方法,具体由谁提供服务由注册服务器来帮助联络。
还可以用 RMI Activation 编程方式来实现RMI远程方法调用,具体请参考 http://java.sun.com/j2se/1.4.2/docs/guide/rmi/activation.html
把HelloServer和HelloClient中的 "//192.168.1.105:1099/Hello 写成 rmi:/192.168.1.105:1099/Hello 感觉会好看一些,因为直接感觉就是在处理rmi协议。
参考资料:
1. JAVA RMI Tutorial
2. Getting Started Using RMI
3. JavaRMI入门实战
4. 使用RMI和CORBA进行分布式java程序设计
5. Think in java中网络编程RMI部分
本实例为参考多篇文章写就而成,网上及书上各类文章介绍如何使用RMI有多种实例可参考,譬如有:
1. 用命令rmiregistry启动RMI注册服务的
2. 同时创建存根(stub)和骨架(skeleton)的
3. 只创建存根类的的(jdk1.2以后版本)
4. 通过RemoteRef和rmi://协议字串方式的
5. 比较少讲到的用LocateRegistry直接在代码上启动RMI注册服务的。
以上描述并非明显分类,比如,你总是可以选择用rmiregistry或者代码LocateRegistry启动RMI注册服务
下面我将介绍一个完整的实例,让初学者能快速体验RMI的功用。
分为以下四个步骤
1. 创建远程接口及声明远程方法(HelloInterface.java)
2. 实现远程接口及远程方法(继承UnicastRemoteObject)(Hello.java)
3. 启动RMI注册服务,并注册远程对象(HelloServer.java)
4. 客户端查找远程对象,并调用远程方法(HelloClient)
5. 执行程序:启动服务HelloServer;运行客户端HelloClient进行调用
具体代码及对应步骤如下:
1. 创建远程接口及声明远程方法(HelloInterface.java)
java 代码
package com.unmi;
import java.rmi.*;
/**
* 远程接口必须扩展接口java.rmi.Remote
*/
public interface HelloInterface extends Remote
{
/**
* 远程接口方法必须抛出 java.rmi.RemoteException
*/
public String say() throws RemoteException;
}
2. 实现远程接口及远程方法(继承UnicastRemoteObject)Hello.java
java 代码
package com.unmi;
import java.rmi.*;
import java.rmi.server.*;
/**
* 扩展了UnicastRemoteObject类,并实现远程接口 HelloInterface
*/
public class Hello extends UnicastRemoteObject implements HelloInterface
{
private String message;
/**
* 必须定义构造方法,即使是默认构造方法,也必须把它明确地写出来,因为它必须抛出出RemoteException异常
*/
public Hello(String msg) throws RemoteException
{
message = msg;
}
/**
* 远程接口方法的实现
*/
public String say() throws RemoteException
{
System.out.println("Called by HelloClient");
return message;
}
}
3. 启动RMI注册服务,并注册远程对象(HelloServer.java)
java 代码
package com.unmi;
import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
public class HelloServer
{
/**
* 启动 RMI 注册服务并进行对象注册
*/
public static void main(String[] argv)
{
try
{
//启动RMI注册服务,指定端口为1099 (1099为默认端口)
//也可以通过命令 $java_home/bin/rmiregistry 1099启动
//这里用这种方式避免了再打开一个DOS窗口
//而且用命令rmiregistry启动注册服务还必须事先用RMIC生成一个stub类为它所用
LocateRegistry.createRegistry(1099);
//创建远程对象的一个或多个实例,下面是hello对象
//可以用不同名字注册不同的实例
HelloInterface hello = new Hello("Hello, world!");
//把hello注册到RMI注册服务器上,命名为Hello
Naming.rebind("Hello", hello);
//如果要把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. 客户端查找远程对象,并调用远程方法(HelloClient)
java 代码
package com.unmi;
import java.rmi.Naming;
public class HelloClient
{
/**
* 查找远程对象并调用远程方法
*/
public static void main(String[] argv)
{
try
{
HelloInterface hello = (HelloInterface) Naming.lookup("Hello");
//如果要从另一台启动了RMI注册服务的机器上查找hello实例
//HelloInterface hello = (HelloInterface)Naming.lookup("//192.168.1.105:1099/Hello");
//调用远程方法
System.out.println(hello.say());
}
catch (Exception e)
{
System.out.println("HelloClient exception: " + e);
}
}
}
5. 执行程序:启动服务HelloServer;运行客户端HelloClient进行调用
代码如何编译这里就不细讲
(1)打开一个Dos窗口执行命令 java com.unmi.HelloServer 启动服务HelloServer
E:workspaceTestRMIbin>java com.unmi.HelloServer
Hello Server is ready.
运行成功则可以看到 Hello Server is ready
(2)打开另一个Dos窗口执行命令 java com.unmi.HelloClient 运行客户端程序
E:workspaceTestRMIbin>java com.unmi.HelloClient
Hello, world!
调用成功则可以看到 Hello, world!
并且在启动服务端的窗口中看到紧跟 Hello Server is ready. 打印出
Called by HelloClient
如果您能一路顺畅的执行到这里,恭喜!您已度过了一个轻快的RMI之旅。
最后来个说明:
本实例中并没有用到JDK所带的命令 rmic 编译实现类得到存根(Stub)类,也没用命令 rmiregistry 命令来启动RMI注册服务。在启动 rmiregistry之前必须能让它加载到相应的stub类,这就是造成**_Stub 类找不到的原因。
如果只是按上面的代码,则服务程序 HelloServer 和客户端程序 HelloClient 都必须运行在本机(如此则RMI有何意义呢?);别急,只要修改HelloClient类,使用第二种形式的lookup查找语句,注释第一条 lookup语句,取消注释第二条lookup语句
//HelloInterface hello = (HelloInterface) Naming.lookup("Hello");
//如果要从另一台启动了RMI注册服务的机器上查找hello实例
HelloInterface hello = (HelloInterface)Naming.lookup("//192.168.1.105:1099/Hello");
其中的IP地址和端口号1099为 RMI 注册服务器的IP和端口号,这样你的HelloClient就可以在另一台机器运行了,当然HelloInterface类必须能找到(但也可指定参数- Djava.rmi.server.codebase从网络加载HelloInterface类)。lookup("Hello")默认为从本机 127.0.0.1的1099端口上查找Hello命令对象,如果第二条语句写成lookup("192.168.1.105/Hello")与原语句是同等的,因为默认端口号就是1099。
代码中 HelloServer 和 HelloClient 省略了设置安全管理器的过程 System.setSecurityManager(new RMISecurityManager()); ,如果设置的安全管理则必须编写相应的访问策略文件,并且在执行时指定参数
无论是启动服务端还是客户端都可以用参数 -Djava.rmi.server.codebase=http://unmi.blogcn.cn/bin 的形式,像JNP一样从网络上加载类,这样更方便于RMI客户端的部署,如RMI客户端是一个Applet
可以拿单独一台机器运行 rmiregistry (它需要能加载到相应的stub类,设置classpath)或用LocateRegistry.createRegistry(port),只作为 RMI远程对象的RMI集中注册的服务器,真正提供服务对象只往上注册,客户端只需从注册服务器上查找远程对象引用,然后调用远程方法,具体由谁提供服务由注册服务器来帮助联络。
还可以用 RMI Activation 编程方式来实现RMI远程方法调用,具体请参考 http://java.sun.com/j2se/1.4.2/docs/guide/rmi/activation.html
把HelloServer和HelloClient中的 "//192.168.1.105:1099/Hello 写成 rmi:/192.168.1.105:1099/Hello 感觉会好看一些,因为直接感觉就是在处理rmi协议。
参考资料:
1. JAVA RMI Tutorial
2. Getting Started Using RMI
3. JavaRMI入门实战
4. 使用RMI和CORBA进行分布式java程序设计
5. Think in java中网络编程RMI部分
发表评论
-
设置JVM启动属性,设置tomcat远程调试端口
2013-02-12 17:08 1029在eclipse中设置启动属性,或者在命令行运行时设置 ... -
Mysql不能连接
2011-01-11 11:07 1086com.mysql.jdbc.CommunicationsEx ... -
Java IO
2011-01-04 12:08 2277本篇主要讲述IO相关的 ... -
[J2SE]Map.Entry 类使用简介(转)
2010-12-10 09:30 878你是否已经对每次从Map中取得关键字然后再取得相应的值感觉厌倦 ... -
比较分析Vector,Arraylist,Hashtable,HashMap数据结构
2010-12-09 09:15 854线性表,链表,哈希表 ... -
JAVA jvm 参数 -Xms -Xmx -Xmn -Xss
2010-11-04 14:40 1194常见配置举例 堆大小 ... -
Error listenerStart
2010-11-04 14:37 831近日浏览论坛,发现好多人提问,都说在运行web程序时,服务器报 ... -
jvm内存调优经验总结
2010-11-04 14:37 855[color=blue][/color][size=x-sma ... -
java的final和static区别
2010-10-19 10:30 898final定义的变量可以看 ... -
Java设计模式中的11种
2010-10-14 17:35 835一:设计模式是最重要 ... -
Lucene源码分析-- Analyzer
2010-08-02 15:09 1353本文主要分析一下 Lucene输入部分——Analyzer(分 ... -
ik-analyzer
2010-08-02 15:05 1017IKAnalyzer是一个开源的,基于java语言开发的轻量级 ... -
Apache Tika文档处理工具
2010-08-02 13:58 2944随着计算机使用的日益普及以及互联网的无处不在,现在有各种语言的 ... -
JDK性能优化
2010-07-29 10:35 1615jvm的server版和client版在上面的表中,我们看到有 ... -
JDK和JRE的区别
2010-07-29 09:49 880简单的说JDK是面向开发人员使用的SDK,它提供了Java的开 ... -
JAVA Process类的简单学习
2010-07-08 14:59 1375(1)执行简单的DOS命令,如打开一个记事本 ... -
Java的多线程程序设计要点
2010-07-07 09:15 6781.多线程中有主内存和 ... -
Java打包指南-JAR文件包及jar命令详解
2010-07-06 17:28 807常常在网上看到有人询问:如何把 java 程序编译成 .exe ... -
javac编译包及包引用文件
2010-07-06 17:27 2299javac和java是sun提供的编译java文件和执行cla ... -
CompletionService
2010-07-05 16:00 1014import java.util.concurrent. ...
相关推荐
分布式Java RMI(Remote Method Invocation)技术是一种在Java平台中实现分布式计算的重要工具,它允许一个对象调用在不同 JVM(Java Virtual Machine)上的另一个对象的方法。在这个项目中,我们利用RMI构建了一个...
9. **测试与调试**:在开发过程中,使用jconsole或jvisualvm等工具可以帮助监控RMI应用的状态,进行性能分析和故障排查。 10. **部署与配置**:RMI应用需要正确配置JVM的classpath、rmiregistry的启动、以及可能的...
Java远程方法调用(Java Remote Method Invocation,简称Java RMI)是一种用于实现远程对象之间通信的技术,它是Java平台的一个核心组件,主要用于解决分布式环境中不同进程间的数据交换问题。Java RMI提供了一种...
Java RMI(Remote Method Invocation,远程方法调用)是Java平台提供的一种分布式计算技术,它允许在不同的Java虚拟机之间进行方法调用,仿佛这些方法是在本地对象上执行一样。这个技术极大地简化了构建分布式应用的...
JAVA RMI(Remote Method Invocation)是一种Java平台上的技术,用于实现不同Java虚拟机(JVM)之间的远程对象通信,从而可以共享资源和处理能力。RMI的目标是提供位置透明性,使得开发者无需关心对象是在本地还是...
定位远程对象的过程通常涉及RMI的命名服务,比如使用Java Naming and Directory Interface (JNDI)。客户端在编写时需要知道提供命名服务的主机和端口,通过JNDI服务查询并获取远程对象的引用。RMI命名服务允许注册和...
Java RMI(Remote Method Invocation)是Java平台提供的一种实现分布式计算的技术,它允许开发者在不同JVM间进行方法调用,如同调用本地对象一样简单。通过RMI,开发者能够构建出强大的分布式应用程序。 #### Java ...
RMI是Java在分布式环境中实现对象间通信的重要手段,它简化了分布式应用程序的开发过程。在这个Java-RMI项目中,我们可以看到它是作为卡内基梅隆大学15-440分布式系统课程的一个实践部分,旨在让学生深入理解和应用...
- 创建并实现一个远程接口,该接口需要继承`java.rmi.Remote`接口,并声明可能抛出`RemoteException`的方法。 - 实现该远程接口,创建一个具体的类来完成实际的业务逻辑。 - 使用`UnicastRemoteObject`将远程对象...
【标题】"RMI实现的网络五子棋"是一个基于Java Remote Method Invocation (RMI)技术构建的在线游戏项目,允许玩家在两台计算机之间进行实时的五子棋对战。RMI是Java平台中用于分布式计算的重要工具,它允许对象在...
在这个"Java RMI demo"中,我们可以通过分析和运行提供的代码来理解RMI的工作原理。 1. **RMI基本概念** - **远程接口(Remote Interface)**:定义了客户端可以调用的远程方法,它继承自`java.rmi.Remote`接口。 ...
Java RMI(Remote Method Invocation)是Java平台中用于实现分布式计算的一种技术。它允许Java对象在不同的 JVM(Java Virtual Machine)之间进行通信,仿佛这些对象都在同一台机器上一样。这个技术的核心概念是远程...
Java RMI (Remote Method Invocation) 是一种Java技术,用于在分布式环境中实现对象之间的远程方法调用。RMI允许开发人员编写可以在网络上其他计算机上执行的方法,就像在本地一样简单。RMI结合了面向对象技术和网络...
在"李亚方实践报告.doc"和"实验六"这两个文件中,可能详细记录了项目的实现过程、遇到的问题以及解决方案。这可能包括了RMI配置、服务器和客户端的代码实现、测试结果以及性能评估等内容。通过阅读这些文档,我们...
这个过程涉及到了Java的序列化和反序列化机制,以及`java.rmi.server.RMIClassLoader`类的作用。 1. **序列化**:远程方法的参数或返回值可能包含服务器特有的类,这些类需要被序列化成字节流,通过网络传输。 2. *...
【标题】"liaotianshi.rar_RMI聊天室_java 网络_rmi _rmi 聊天_网络聊天室" 涉及的主要知识点是使用Java的远程方法调用(Remote Method Invocation, RMI)技术来实现一个网络聊天室。RMI是Java平台提供的一种分布式...
Java远程方法调用(Java RMI)是Java语言中实现远程过程调用(RPC)的一种应用程序编程接口。它允许客户机上的程序调用远程服务器上的对象方法,即Java中的远程对象。使用RMI可以在网络环境中分布操作,使得Java编程...
在IT行业中,远程监控是一项重要的技术,...总的来说,Java实现远程监控是一个涉及JMX、RMI以及网络编程的综合过程。通过合理设计和实现,我们可以构建出一个强大且灵活的监控解决方案,有效管理和维护我们的Java应用。
Java聊天软件是网络通信的一种典型应用,而基于RMI(Remote Method Invocation)和Socket的实现方式则为这种软件提供了高效且灵活的通信机制。RMI是Java平台内建的一种远程对象调用技术,它允许一个Java对象调用另一...
【rmi-lite 1.0】是一个轻量级的Java Remote Method Invocation (RMI)实现,它是Java RMI技术的一个简化版本,适用于那些不需要完整RMI功能但仍然希望利用远程对象交互的项目。RMI是Java平台上的一个核心特性,它...