今天看一天的RMI终于搞懂了,到底是怎么回事了。
RMI网上有很多说明,大概就是这样的。
1、 编写并且编译接口的Java代码
2、 编写并且编译接口实现的Java代码
3、 从接口实现类中生成 Stub 和 Skeleton 类文件
4、 编写远程服务的主运行程序
5、 编写RMI的客户端程序
6、 安装并且运行RMI系统
先讲一种网上最常见的(参考资料来源Java RMI Tutorial)
首先编写服务断对外提供的接口,必须继承 java.rmi.Remote。
接口代码如下:
import java.rmi.*;
/**
* Remote Interface for the "Hello, world!" example.
*/
public interface HelloInterface extends Remote {
/**
* Remotely invocable method.
* @return the message of the remote object, such as "Hello, world!".
* @exception RemoteException if the remote invocation fails.
*/
public String say() throws RemoteException;
}
再来就是对该接口的实现,这里有两种方式(一种是必须实现该接口,必继承java.rmi.server.UnicastRemoteObject,另一种是只实现该接口,但是必须调用UnicastRemoteObject.exportObject方法),采用第一种代码如下:
import java.rmi.*;
import java.rmi.server.*;
/**
* Remote Class for the "Hello, world!" example.
*/
public class Hello extends UnicastRemoteObject implements HelloInterface {
private String message;
/**
* Construct a remote object
* @param msg the message of the remote object, such as "Hello, world!".
* @exception RemoteException if the object handle cannot be constructed.
*/
public Hello (String msg) throws RemoteException {
message = msg;
}
/**
* Implementation of the remotely invocable method.
* @return the message of the remote object, such as "Hello, world!".
* @exception RemoteException if the remote invocation fails.
*/
public String say() throws RemoteException {
return message;
}
}
分别编译文件。
编译完成后,要从接口实现类中生成 Stub 和 Skeleton 类文件,这时就要用到
rmic Hello
命令,如果出现错误,请讲Hello.class的路径设置到classpath路径下。
然后编写客户器端代码:
/**
* Client program for the "Hello, world!" example.
* @param argv The command line arguments which are ignored.
*/
public static void main (String[] argv) {
try {
HelloInterface hello =
(HelloInterface) Naming.lookup ("//172.0.0.1/Hello");
System.out.println (hello.say());
} catch (Exception e) {
System.out.println ("HelloClient exception: " + e);
}
}
然后编译。
然后编写服务端代码,
/**
* Server program for the "Hello, world!" example.
* @param argv The command line arguments which are ignored.
*/
public static void main (String[] argv) {
try {
Naming.rebind ("Hello", new Hello ("Hello, world!"));
System.out.println ("Hello Server is ready.");
} catch (Exception e) {
System.out.println ("Hello Server failed: " + e);
}
}
然后编译,
开始启动服务器,这里是最麻烦的,
首先开启RMI Registry(注册表),
输入命令行:rmiregistry &
完成后放在一边保持不动,重新开启一个终端。
然后运行:
java HelloServer &
完成后放在一边保持不动,再重新开启一个终端。
最后再
java HelloClient。
终于成功显示。
这样太麻烦了,还容易出错,有没有简单方法呢?
有下面 我就来介绍介绍:
前面还是一样的,我重新写了代码:如下
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface TestInterfactRemote extends Remote {
public String echo(String message) throws RemoteException;
}
import java.rmi.RemoteException;
public class TestInterfaceRemoteImpl implements TestInterfactRemote {
public String echo(String message) throws RemoteException {
if("quit".equalsIgnoreCase(message.toString())){
System.out.println("Server will be shutdown");
System.exit(0);
}
System.out.println("Message from client:"+ message);
return "server response" + message;
}
}
不同的地方在于服务端和客户端,仔细看:
public class Server {
public Server() {
try {
int port = 9527;
String name = "testDemo";
TestInterfactRemote testInterfactRemote = new TestInterfaceRemoteImpl();
//完成对象的绑定
UnicastRemoteObject.exportObject(testInterfactRemote, port);
//完成注册表的开启
Registry registry = LocateRegistry.createRegistry(1099);
//这里没有用Naming绑定,运用的是registry提供的绑定方法
registry.rebind(name, testInterfactRemote);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String args[]) {
new Server();
}
}
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import test.TestInterfactRemote;
public class Client {
public static void main(String args[]) {
try {
//获得登记注册表的位置
Registry registry = LocateRegistry.getRegistry("localhost");
String name = "testDemo";
//运用注册表进行对象的查找
TestInterfactRemote testInterfactRemote = (TestInterfactRemote) registry.lookup(name);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input = br.readLine();
String reponse = testInterfactRemote.echo(input);
System.out.println(reponse);
} catch (Exception e) {
e.printStackTrace();
}
}
}
直接编译完成后运行试试结果是怎么样的?
这样很简单吧!又好理解。
分享到:
相关推荐
最近在学习代理模式,用到了java rmi远程调用,包含服务端和客户端,之前一直没有接触过,学习了java rmi远程调用,一方面可以了解代理模式,一方面熟悉java低层的远程
Java RMI 远程调用实例,各个文件的作用: DISPLAYPERFECTTIME.JAVA|:向rmiregistry查找PerfectTime对象,定义调用远程对象的方法。 PERFECTTIME.JAVA:向RMI注册服务,以便客户端查找,创建提供注册服务的本地...
接下来,`getMemberAccountCount`方法实现了远程调用逻辑,通过`this.ref.invoke`方法调用了远程方法,并处理了可能抛出的异常。 #### 2. 客户端代码分析 客户端通过`Naming.lookup`方法获取远程服务的引用,然后...
实现java RMI 远程调用,包括 RMIServer RMIClient源码,测试用例。
Java RMI(Remote Method Invocation,远程方法调用)是Java平台提供的一种分布式计算技术,它允许在不同的Java虚拟机之间透明地调用对象的方法。在RMI架构中,客户端能够像调用本地对象一样调用远程服务器上的对象...
Java远程调用(Remote Method Invocation,RMI)是Java平台中一种重要的分布式计算技术,它允许在不同网络环境中的Java对象之间进行透明的交互。在本文中,我们将深入探讨三种不同的RMI实现方法:原始方式、Spring...
首先,我们需要定义一个实现了`java.rmi.Remote`接口的类,比如`MyRemoteInterface.java`,并在这个接口中声明所有需要远程调用的方法。这些方法必须抛出`java.rmi.RemoteException`,因为网络通信可能会出现异常。...
Java RMI(Remote Method Invocation,远程方法调用)是Java平台提供的一种分布式计算技术,它允许在不同的Java虚拟机之间进行方法调用,仿佛这些方法是在本地对象上执行一样。这个技术极大地简化了构建分布式应用的...
1. **创建远程接口**:定义一个继承自Remote的接口,声明需要远程调用的方法。 2. **实现远程接口**:编写一个类实现这个接口,提供具体的方法实现。 3. **注册远程对象**:在服务器端创建远程对象实例,然后将其...
### RMI远程调用代码及使用方法 #### 一、RMI简介 远程方法调用(Remote Method Invocation,简称RMI)是Java平台提供的一种分布式计算技术,它允许开发人员在不同的Java虚拟机(JVM)之间进行对象的远程调用。通过...
这个简单的例子将引导我们了解如何利用Java RMI实现远程调用。 首先,我们要创建远程接口。在Java RMI中,远程接口是一个实现了`java.rmi.Remote`接口的Java接口。接口中声明的方法将在客户端调用,实际上会在...
Java RMI(Remote Method Invocation,远程方法调用)是Java平台提供的一种分布式计算技术,它允许Java对象在不同的网络环境中进行交互,就像调用本地方法一样。RMI系统的核心概念是客户端可以调用服务器端的对象上...
总结来说,RMI远程调用是Java实现分布式计算的关键技术,它通过简化网络编程,使开发者能专注于业务逻辑,而非底层通信细节。结合Spring框架,可以进一步提升RMI应用的开发效率和可维护性。在实际项目中,合理利用...
Java 远程方法调用(Java RMI,Remote Method Invocation)是Java平台提供的一种用于构建分布式应用程序的技术。它允许一个对象在某个Java虚拟机(JVM)上执行的方法调用另一个在不同JVM上的对象的方法,仿佛它们是...
1. 远程接口(Remote Interface):定义了可以被远程调用的方法,这些方法必须声明抛出`java.rmi.RemoteException`。接口需要使用`@Remote`注解标记。 2. 远程实现类(Remote Implementation):实现了远程接口,并...
这些方法必须抛出`java.rmi.RemoteException`,因为远程调用过程中可能会出现网络通信问题。例如: ```java public interface MyRemoteInterface extends Remote { void executeCommand(String cmd) throws ...
在这个场景中,“rmi远程调用读取文件”指的是通过RMI机制,使得一个JVM中的程序能够请求另一个JVM上的程序读取并返回文件内容。这种方式在分布式系统中非常常见,可以用于数据共享、文件服务等应用。 RMI的基本...
4. ** stubs 和 skeletons**:在RMI中,远程对象的引用在客户端是通过stubs(桩)表示的,而实际的远程调用则由serverside的skeleton(骨架)处理。现代的JVM已经不再需要手动生成stubs和skeletons,它们由Java...
在提供的`动态代理与RMI远程调用.ppt`中,可能会详细解释这两个概念,通过PPT的讲解和实例,可以更直观地理解动态代理和RMI的工作原理。同时,`src`目录下的源码文件则提供了具体的实现示例,读者可以通过阅读代码,...
在Windows环境下,同样需要JRE,运行客户端程序来执行远程调用。 注意,RMI的安全性、异常处理和网络通信细节也是开发者需要考虑的问题。例如,需要处理可能的`RemoteException`,以及配置JVM的安全策略文件以允许...