今天写了一个简单的RMI程序
一、开发工具 eclipse3.1
JDK1.4
二、目录结构
E:\SHIWEI\STUDY\RMI
│ .classpath
│ .project
│
├─bin
│ └─com
│ └─snoics
│ └─study
│ └─rmi
│ └─information
│ client.policy
│ Information.class
│ InformationClient.class
│ InformationImpl.class
│ InformationImpl_Stub.class
│ InformationServer.class
│ ShowBindingsName.class
│
└─src
└─com
└─snoics
└─study
└─rmi
└─information
client.policy
Information.java
InformationClient.java
InformationImpl.java
InformationServer.java
ShowBindingsName.java
首先创建一个接口:
/*
* FileName Information.java
* Create Time 2005-10-14 13:43:28
* Author shiwei
* Descript
* Version
*/
package com.snoics.study.rmi.information;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Information extends Remote{
String getDescript() throws RemoteException;
}
接口的实现:
/*
* FileName InformationImpl.java
* Create Time 2005-10-14 13:44:59
* Author shiwei
* Descript
* Version
*/
package com.snoics.study.rmi.information;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class InformationImpl extends UnicastRemoteObject implements Information{
private static final long serialVersionUID = -3493514659140991974L;
private String descript="";
public InformationImpl(String descript) throws RemoteException{
this.descript=descript;
}
public String getDescript() throws RemoteException{
return "show Descript: "+descript+"!";
}
}
服务端的代码:
/*
* FileName InformationServer.java
* Create Time 2005-10-14 13:48:36
* Author shiwei
* Descript 服务端
* Version
*/
package com.snoics.study.rmi.information;
import java.rmi.Naming;
public class InformationServer {
public InformationServer() {
}
/**
* 注册绑定服务
*
*/
public void bindServer() {
try {
System.out.println("创建服务");
InformationImpl productImpl1=new InformationImpl("I'm a Person");
InformationImpl productImpl2=new InformationImpl("I'm a Work");
System.out.println("Binding Server to registry");
Naming.rebind("person",productImpl1);
Naming.rebind("work",productImpl2);
}catch(Exception e) {
e.printStackTrace() ;
}
}
public static void main(String[] args) {
InformationServer informationServer=new InformationServer();
informationServer.bindServer();
ShowBindingsName showBindingsName=new ShowBindingsName();
showBindingsName.show();
}
}
再创建一个ShowBindingsName.java显示服务器注册的名称:
/*
* FileName ShowBindingsName.java
* Create Time 2005-10-14 13:53:50
* Author shiwei
* Descript 显示Naming List
* Version
*/
package com.snoics.study.rmi.information;
import java.rmi.Naming;
public class ShowBindingsName {
/**
* 显示Naming List
*
*/
public void show() {
try {
String[] bindings=Naming.list("");
int length=bindings.length;
for(int i=0;i System.out.println(bindings[i]);
}
}catch(Exception e) {
e.printStackTrace() ;
}
}
}
客户端的代码:
/*
* FileName InformationClient.java
* Create Time 2005-10-14 13:56:39
* Author shiwei
* Descript 客户端
* Version
*/
package com.snoics.study.rmi.information;
import java.rmi.Naming;
import java.rmi.RMISecurityManager;
public class InformationClient {
/**
* 远程调用
*
*/
public void showInformation() {
System.setProperty("java.security.policy", "E:/ShiWei/Study/RMI/bin/com/snoics/study/rmi/information/client.policy");
System.setSecurityManager(new RMISecurityManager());
String url="rmi://localhost/";
try {
Information information1=(Information)Naming.lookup(url+"person");
Information information2=(Information)Naming.lookup(url+"work");
System.out.println("information1.descript="+information1.getDescript());
System.out.println("information2.descript="+information2.getDescript());
}catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
InformationClient informationClient=new InformationClient();
informationClient.showInformation();
}
}
安全策略文件 client.policy
grant
{
permission java.net.SocketPermission
"*:1024-65535", "connect,accept";
permission java.net.SocketPermission
"*:80", "connect";
};
三、部署程序:
代码写完就该开始动手部署了,RMI的部署也是一个非常让人头疼的问题。
只要一步步的跟着我下面的操作进行,一定可以把这个程序部署起来的。
首先假设编译好的class放到 E:\ShiWei\Study\RMI\bin 路径下面。
打开DOS窗口
1、设置classpath 输入: C:\>set classpath=E:\ShiWei\Study\RMI\bin
2、创建存根 输入: C:\>rmic -v1.2 -d E:\ShiWei\Study\RMI\bin com.snoics.study.rmi.information.InformationImpl
3、启动RMI注册表 输入: C:\>start rmiregistry
4、启动服务端程序 输入: C:\>start java com.snoics.study.rmi.information.InformationServer
5、执行客户端程序 输入: C:\>java com.snoics.study.rmi.information.InformationClient
6、如果以上的步骤全部执行成功,将在控制台上看到以下的信息:
information1.descript=show Descript: I'm a Person!
information2.descript=show Descript: I'm a Work!
四、注意:
如果在执行过程中,客户端执行失败,请检查是否有打开防火墙,请把防火墙关闭以后重新执行客户端程序。