在Eclipse上编写RMI程序后,需要到cmd条件下测试。
RMI服务端接口:
package RMI;
import java.rmi.Remote;
import java.rmi.RemoteException;
/**
* @author wang xiaonan
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public interface PerfectTimeI extends Remote {
long getPerfectTime() throws RemoteException;
}
RMI服务端实现:
package RMI;
import java.rmi.*;
import java.rmi.RMISecurityManager;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
/**
* @author wang xiaonan
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class PerfectTime extends UnicastRemoteObject implements PerfectTimeI {
/**
* @throws RemoteException
*/
protected PerfectTime() throws RemoteException {
super();
// TODO Auto-generated constructor stub
}
/* (non-Javadoc)
* @see RMI.PerfectTimeI#getPerfectTime()
*/
public long getPerfectTime() throws RemoteException {
// TODO Auto-generated method stub
return System.currentTimeMillis();
}
public static void main(String[] args) throws Exception{
System.setSecurityManager(new RMISecurityManager());
PerfectTime pt=new PerfectTime();
Naming.bind("PerfectTime", pt);
System.out.println("Ready to do time.");
}
}
客户端程序:
package RMI;
import java.rmi.Naming;
import java.rmi.RMISecurityManager;
/**
* @author wang xiaonan
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class DisplayPerfectTime {
public static void main(String[] args) throws Exception{
System.setSecurityManager(new RMISecurityManager());
PerfectTimeI t=(PerfectTimeI)Naming.lookup("PerfectTime");
for (int i=0;i<100;i++)
System.out.println("PerfectTime = "+t.getPerfectTime());
}
}
此外还需要制定规则文件来修改操作系统的安全规则,否则程序可能不能运行:
RmiPolicy.policy:
grant codeBase
"file:/D:/eclipse-SDK-2.1.2-win32/eclipse/workspace/has/bin/"{
permission java.security.AllPermission;
permission java.util.PropertyPermission "*" ,"read";
permission java.util.PropertyPermission "java.version", "read";
permission java.util.PropertyPermission "java.vendor", "read";
permission java.util.PropertyPermission "java.vendor.url", "read";
permission java.util.PropertyPermission "java.class.version", "read";
permission java.util.PropertyPermission "os.name", "read";
permission java.util.PropertyPermission "os.version", "read";
permission java.util.PropertyPermission "os.arch", "read";
permission java.util.PropertyPermission "file.separator", "read";
permission java.util.PropertyPermission "path.separator", "read";
permission java.util.PropertyPermission "line.separator", "read";
permission java.util.PropertyPermission "java.specification.version",
"read";
permission java.util.PropertyPermission "java.specification.vendor",
"read";
permission java.util.PropertyPermission "java.specification.name", "read";
permission java.util.PropertyPermission "java.vm.specification.version",
"read";
permission java.util.PropertyPermission "java.vm.specification.vendor",
"read";
permission java.util.PropertyPermission "java.vm.specification.name",
"read";
permission java.util.PropertyPermission "java.vm.version", "read";
permission java.util.PropertyPermission "java.vm.vendor", "read";
permission java.util.PropertyPermission "java.vm.name", "read";
};
grant
{
permission java.net.SocketPermission
"*:1000-9999","accept,connect,listen,resolve";
};
配置好之后可以打开cmd环境了(总共需要三个cmd窗口):
在项目路径下使用制定好的policy文件启动rmi服务:
C:/Computer/Document/Tech/Project/HAS/RMI>rmiregistry -J-Djava.security.policy=RmiPolicy.policy
前面路径为项目所在路径。
然后启动服务端程序:
C:/Computer/Document/Tech/Project/Has/RMI>java -Djava.security.policy=RmiPolicy.policy RMI.PerfectTime
程序前头挂着包名。
最后运行客户端程序看看能否访问服务端:
C:/Computer/Document/Tech/Project/Has/RMI>java -Djava.security.policy=RmiPolicy.policy -Djava.rmi.server.codebase=http://localhost:8080/ RMI.DisplayPerfectTime