java RMI 在eclipse中的实现

      java RMI的概念:

RMI 是 Remote Method Invocation 的简称,是一种计算机之间利用远程对象互相调用来实现双方通讯的一种机制。RMI提供了客户辅助对象(即客户机的代理)和服务辅助对象(即服务器的代理),为客户辅助对象创建和服务对象相同的方法。RMI的好处在于你不必亲自写任何网络或I/O代码(即不需要理会底层的计算机与计算机之间的底层通信机制),就可以像调用本地java对象的方法一样调用远程对象的方法,使分布在不同JVM中的对象的行为和外表都像本地对象一样。

     RMI中的stub和skeleton:

在使用RMI的时候,不得不提stub和skeleton的作用。说白点,stub和skeleton在RMI的角色就是客户辅助对象和服务辅助对象,它们在现实开发中主要是为了隐藏系统和网络中的差异,这部分的功能在RMI的开发中对程序员是透明的。stub把客户端调用远程对象的命令进行编码并把它们发送到服务器,而skeleton则是把远程命令解码,并调用服务端的远程对象的方法,再把方法的结果编码发送给stub,而stub再将结果解码返回给客户端。其中,编码解码可以通过java的序列化(serializable)来完成,所以如果你使用原语类型、字符串和许多API内定的类型都不会有问题,但如果你传送自己定义的类,就必须保证你的类实现了Serializable。从JDk5.0以后,这两个类就不需要rmic(java中rmi的编译命令)来产生了,而是由JVM进行自动处理,但实际上它们还是存在的。

    RMI实例开发:

1、先创建远程服务接口并声明远程服务方法,这是双方通讯的接口,即这是客户端和服务端都需要进行访问的

2、创建一个类来实现远程接口和远程方法,并继承UnicastRemoteObject,作为服务器上的类(即客户端想要远程进行访问的类)

3、创建客户端的类来查找远程对象,并调用远程方法

    远程服务接口为:

public interface RemotePrinter extends Remote {

	public int submitJob(String text) throws RemoteException;
	
	public boolean isComplete(int jobID) throws RemoteException;
	
	public String getPrinterStatus() throws RemoteException;
}
  实现远程服务接口的服务器上的类:(指创建一个实现远程接口的对象,到处该对象,并把其用一字符串绑定到RMI的注册表中,含有main主方法的类)

  main方法主要完成以下任务:创建远程对象;使用java RMI Registry注册和绑定该远程对象

import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;

import demo.rmi.print.common.RemotePrinter;

public class RemotePrinterImpl extends UnicastRemoteObject implements
		RemotePrinter {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	public RemotePrinterImpl() throws RemoteException{
		//因为父类的构造函数抛出了异常,所以子类必须申明自己的构造函数并抛出异常
	}
	@Override
	public int submitJob(String text) throws RemoteException {
		// TODO Auto-generated method stub
		System.out.print("submitted job"+text);
		return 0;
	}

	@Override
	public boolean isComplete(int jobID) throws RemoteException {
		// TODO Auto-generated method stub
		System.out.println("requested job status");
		return false;
	}

	@Override
	public String getPrinterStatus() throws RemoteException {
		// TODO Auto-generated method stub
		System.out.println("requested printer status");
		return "OK";
	}
	
	public static void main(String args[])
	{
		try{ //简单地返回一个合适的注册表存根,该存根发送调用到本地端口为1099的服务器表,那时
			Registry r=LocateRegistry.getRegistry();
			r.bind("printer",new RemotePrinterImpl());
			System.out.println("Print server is ready.");
		}catch(Exception e){
			e.printStackTrace();
		}
	}

}
客户端的类(从服务端的注册表中,客户端调用naming.lookup()以获得远程对象的存根):

import java.rmi.Naming;
import java.rmi.RMISecurityManager;

import demo.rmi.print.common.RemotePrinter;

public class PrintClient {
	
	public static void main(String args[])
	{
		try{//由于只要一个程序从网络位置加载新的代码,就会涉及完全问题。正是由于这个原因,我们需要在动态加载类的RMI应用中使用安全管理器
			    System.setSecurityManager(new RMISecurityManager());
			    RemotePrinter printer=(RemotePrinter) Naming.lookup("rmi://localhost/printer");
			    int jobID=printer.submitJob("Hello World");
			    System.out.println("Submitted job"+jobID);
			    System.out.println("Is job complete"+printer.isComplete(jobID));
			    System.out.println("Printer status?"+printer.getPrinterStatus());
		   }
		catch(Exception e){
			    e.printStackTrace();
		  }
    }
}
      RMI在eclipse上的运行(远程对象和客户端在一台机器上)

1、在eclipse上运行RMI需要安装RMI插件,可以通过点击Eclipse上的菜单Help->Install New SoftWare进行安装,安装示意图如下所示:         

        java RMI 在eclipse中的实现_第1张图片

2、生成服务器程序的存根文件,右键点击工程名称print-server, rmi->enable stubs generations.选中后在我们的工程文件夹下相应的包中就生成了RemotePrinterImpl_Stub.class类。示意图如下所示:

                            java RMI 在eclipse中的实现_第2张图片

3、启动RMIRegistry,点击工具条上RMI plugin图标,在菜单中选择Start Lcoal Registry,示意图如下所示:

                                                    java RMI 在eclipse中的实现_第3张图片

4、配置运行RMI服务,右键点击左边树中的RemotePrinterImpl.java文件,菜单run as->rmi application,在弹出对话框中找到RMI VM Properties.选中java.security.polcy的value框,点击按钮会出现文件选择对话框,我们这里采用自动生成的security.policy文件,同理,java.rmi.server.codebase也采用生成的服务器的地址。设置过后,就将服务器程序运行起来。示意图如下所示:

                  java RMI 在eclipse中的实现_第4张图片

                                                                      RMI VM Properties的前两项内容进行配置

                java RMI 在eclipse中的实现_第5张图片

                                                     点击Create按钮,出现对话框,然后在相应文件夹下生成security.policy文件

                                                  java RMI 在eclipse中的实现_第6张图片

                                                                                  点击Compute from classpath按钮,自动生成codebase URL地址

5、运行客户端程序,工程树中右键点击RemoteClient.java文件,同理,按刚才的方法对RMI VM Properties 进行设置,注意Client的codebaseURL地址需要设置成服务器程序的地址,security policy也设置成服务器程序生成的文件的地址。然后就能成功运行。示意图如下所示:

                 java RMI 在eclipse中的实现_第7张图片


你可能感兴趣的:(java,RMI,网络通信,java)