RMI 开发方法

RMI 开发步骤
开发RMI步骤:
1.编写服务接口,此接口须直接或间接继承至Remote接口,且此服务接口中的所有方法必须声明抛出受查RemoteException异常.

package com.pa.rmi.test;

import java.rmi.Remote;

public interface BaseRemoteInterface extends Remote {

}


2.编写服务接口的实现类,继承UnicastRemoteObject,并实现服务接口.UnicastRemoteObject是一个用于构建RMI Server的便利基类,它可以处理大部分服务器创建的工作,如当调用其构造函数时,将自动创建Socket,并在给定的端口上监听客户端的请求.
package com.pa.rmi.test.upload;

import java.rmi.RemoteException;

import com.pa.rmi.test.BaseRemoteInterface;

public interface FileUploadHandler extends BaseRemoteInterface{

	public boolean upload(String src,String dest)throws FileUploadException,RemoteException;
}


3.使用rmic生成此实现类的stub(存根)和skeleton(骨架)
如何生成stub请参见本人的另一篇文章:JDK1.6 rmic命令使用

4.创建一个服务器,用于发布2中写好的类
package com.pa.rmi.test;

import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;

import com.pa.rmi.test.upload.FileUploadHandler;
import com.pa.rmi.test.upload.FileUploadHandlerImpl;

public class RMIRegistHelper {
	
	public static void regist(Remote remoteObject, String name,Integer port ) {
		try {
			if(port==null||port==0){
				port = 1099;
			}
			LocateRegistry.createRegistry(port);
			Naming.bind("rmi://localhost:"+port+"/" + name, remoteObject);
			System.out.println(name+" bound successful,listen on port :"+port);
		} catch (RemoteException e) {
		} catch (AlreadyBoundException e) {
		} catch (MalformedURLException e) {
		}
	}

	public static void main(String args[]) throws Exception {
         FileUploadHandler handler = new FileUploadHandlerImpl();
         regist(handler,"fileUploadHandler",null);
	}
}



5.创建一个客户程序进行RMI调用
 

package com.pa.rmi.test.upload;

import java.net.MalformedURLException;
import java.rmi.*;

public class ClientTest {

	public static void main(String args[]) {
		try {
			// 在RMI服务注册表中查找名称为fileUploadHandler的对象,并调用其上的方法
			FileUploadHandler fileUploadHandler = (FileUploadHandler) Naming.lookup("rmi://localhost:1099/fileUploadHandler");
			System.out.println(fileUploadHandler.upload("",""));
		} catch (NotBoundException e) {
			e.printStackTrace();
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (RemoteException e) {
			e.printStackTrace();
		} catch (FileUploadException e) {
			e.printStackTrace();
		}
	}

}


1 楼 shaoxuexue86 2012-08-03  
请问客户端程序ClientTest 与 RMIRegistHelper 是在一个项目当中吗? 不然是怎么引入FileUploadHandler 的呢?如果是在不同的项目中是不是把FileUploadHandler 这个半制品类也要拷到另一个项目当中?我是这样做的不确定这样做是不是对的?谢谢
2 楼 huxiaojun_198213 2012-08-04  
RMIRegistHelper只是负责注册远程对象,与客户端所处的位置并无关系。FileUploadHandler是远程接口,客户端要调用远程对象的方法,必须通过远程接口来操作(远程对象是没有向客户端暴露的),因此在客户端测试中,必须将远程接口放在客户端的classpath中。
3 楼 shaoxuexue86 2012-08-24  
RMI 开发方法 谢谢啊