java RMI(java远程方法调用实例解析)
2011-10-15 11:24
465 查看
在 Java 中,远程对象是实现远程接口的类的实例, 远程接口声明每个要远程调用的方法。在需要创建一个远程对象的时候,我们通过传递一个接口来隐藏基层的实施细节,客户通过接口句柄发送消息即可。
远程接口具有如下特点:
1) 远程接口必须为public属性。如果不这样,除非客户端与远程接口在同一个包内,否则 当试图装入实现该远程接口的远程对象时,调用会得到错误结果。
2) 远程接口必须扩展接口java.rmi.Remote。
3) 除与应用程序本身特定的例外之外,远程接口中的每个方法都必须在自己的throws从句中 声明java.rmi.RemoteException。(或RemoteException 的父类)。
4) 作为参数或返回值传递的一个远程对象(不管是直接,还是本地对象中嵌入)必须声明为远 程接口,而不应声明为实施类。
例如:
1)创建远程接口TestRemote.java,源代码如下:
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface TestRemote extends Remote {
public int add(int a, int b) throws RemoteException;
}
2)创建远程接口的实现类TestRemoteImpl.java,源代码如下:
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class TestRemoteImpl extends UnicastRemoteObject implements TestRemote {
protected TestRemoteImpl() throws RemoteException {
super();
}
public int add(int a, int b) throws RemoteException {
return a+b;
}
}
3)编写服务器端代码Server.java,源代码如下:
import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
public class Server {
public static void main(String[] args) throws Exception {
try {
LocateRegistry.createRegistry(8808) ;
// 创建远程对象
TestRemote testRemote = new TestRemoteImpl();
// 奖名称绑定到对象
Naming.rebind("rmi://localhost:8808/server", testRemote);
System.out.println("RMI服务器正在运行。。。。。。");
} catch (Exception e) {
e.printStackTrace();
}
}
}
4)编写客户端代码 Client.java,源代码如下:
import java.rmi.Naming;
public class Client {
public static void main(String[] args) {
try {
String url = "rmi://localhost:8808/server";
TestRemote RmiObject = (TestRemote)Naming.lookup(url);
System.out.println(" 1 + 2 = " + RmiObject.add(1, 2) );
} catch (Exception exc) {
System.out.println("Error in lookup: " + exc.toString());
}
}
}
5)编译源代码:
javac Server.java
javac Client.java
6)为远程对象实现创建根和干:
要创建存根程序和骨架文件,应以包含远程对象实现的已编译类包全名运行 rmic 编译器。
存根(Stub)是远程对象在客户端的代理,它将RMI调用传递给服务器端的骨架(Skeleton),后者负责将该调用传递给实际的远程方法,
输入如下:
rmic -d E:\rmi TestRemoteImpl
其中;E:\rmi是代码保存的位置。
7)运行服务器端程序和客户端程序:
java Server
java Client
远程接口具有如下特点:
1) 远程接口必须为public属性。如果不这样,除非客户端与远程接口在同一个包内,否则 当试图装入实现该远程接口的远程对象时,调用会得到错误结果。
2) 远程接口必须扩展接口java.rmi.Remote。
3) 除与应用程序本身特定的例外之外,远程接口中的每个方法都必须在自己的throws从句中 声明java.rmi.RemoteException。(或RemoteException 的父类)。
4) 作为参数或返回值传递的一个远程对象(不管是直接,还是本地对象中嵌入)必须声明为远 程接口,而不应声明为实施类。
例如:
1)创建远程接口TestRemote.java,源代码如下:
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface TestRemote extends Remote {
public int add(int a, int b) throws RemoteException;
}
2)创建远程接口的实现类TestRemoteImpl.java,源代码如下:
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class TestRemoteImpl extends UnicastRemoteObject implements TestRemote {
protected TestRemoteImpl() throws RemoteException {
super();
}
public int add(int a, int b) throws RemoteException {
return a+b;
}
}
3)编写服务器端代码Server.java,源代码如下:
import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
public class Server {
public static void main(String[] args) throws Exception {
try {
LocateRegistry.createRegistry(8808) ;
// 创建远程对象
TestRemote testRemote = new TestRemoteImpl();
// 奖名称绑定到对象
Naming.rebind("rmi://localhost:8808/server", testRemote);
System.out.println("RMI服务器正在运行。。。。。。");
} catch (Exception e) {
e.printStackTrace();
}
}
}
4)编写客户端代码 Client.java,源代码如下:
import java.rmi.Naming;
public class Client {
public static void main(String[] args) {
try {
String url = "rmi://localhost:8808/server";
TestRemote RmiObject = (TestRemote)Naming.lookup(url);
System.out.println(" 1 + 2 = " + RmiObject.add(1, 2) );
} catch (Exception exc) {
System.out.println("Error in lookup: " + exc.toString());
}
}
}
5)编译源代码:
javac Server.java
javac Client.java
6)为远程对象实现创建根和干:
要创建存根程序和骨架文件,应以包含远程对象实现的已编译类包全名运行 rmic 编译器。
存根(Stub)是远程对象在客户端的代理,它将RMI调用传递给服务器端的骨架(Skeleton),后者负责将该调用传递给实际的远程方法,
输入如下:
rmic -d E:\rmi TestRemoteImpl
其中;E:\rmi是代码保存的位置。
7)运行服务器端程序和客户端程序:
java Server
java Client
相关文章推荐
- 学习笔记:JAVA RMI远程方法调用简单实例
- JAVA RMI远程方法调用简单实例
- 学习笔记:JAVA RMI远程方法调用简单实例
- JAVA RMI(远程方法调用)简单实例
- JAVA RMI远程方法调用简单实例
- JAVA RMI远程方法调用简单实例
- 学习笔记:JAVA RMI远程方法调用简单实例
- JAVA RMI远程方法调用简单实例
- JAVA RMI远程方法调用简单实例(转载)
- 学习笔记:JAVA RMI远程方法调用简单实例
- JAVA RMI远程方法调用简单实例
- 学习笔记:JAVA RMI远程方法调用简单实例
- 学习笔记:JAVA RMI远程方法调用简单实例
- JAVA RMI远程方法调用简单实例[转]
- JAVA RMI远程方法调用简单实例
- 第十一篇 RMI远程方法调用之Java项目实例
- java远程方法调用(java RMI)
- 学习笔记:JAVA RMI远程方法调用简单实例