RMI程序编写简单指南

来源:互联网 发布:windows 终端仿真软件 编辑:程序博客网 时间:2024/06/07 21:02

在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