RMI学习笔记

  RMI(Remote Method Invocation,远程方法调用)是用Java在JDK1.1中实现的,它大大增强了Java开发分布式应用的能力。Java作为一种风靡一时的网络开发语言,其巨大的威力就体现在它强大的开发分布式网络应用的能力上,而RMI就是开发百分之百纯Java的网络分布式应用系统的核心解决方案之一。其实它可以被看作是RPC的Java版本。但是传统RPC并不能很好地应用于分布式对象系统。而Java RMI 则支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。
  在一个稍微完整的系统中,会有各种各样第三方系统或子系统,系统之间经常需要交互。大概分为实时的和非实时的。实时的实现起来大概有webservice,http,rmi等,非实时的大概有ftp/sftp上传下载文件,通过扫描数据库表等。总的来说,在不同的jvm间进行简单的交互,没必要使用webservice,显得过于臃肿。下面就记录下学习RMI的一个简单例子。


配置文件rmi.conf。方便对rmi进行修改。

url=rmi://127.0.0.1:8889/RHello
interface=com.mclaren.network.rmi.IHello
implementClz=com.mclaren.network.rmi.HelloImpl

IHello.java

package com.mclaren.network.rmi;

import java.rmi.Remote;
import java.rmi.RemoteException;

/**
 * 
 * @ClassName:   IHello 
 * @Description: TODO
 * @author       Mclaren Pan
 * @date         2014-10-8 下午11:11:47 
 *
 */
public interface IHello extends Remote {
	
	public String helloWorld() throws RemoteException;
	
	public String sayHelloToSomeBody(String someBody) throws RemoteException;
}


HelloImpl.java

package com.mclaren.network.rmi;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

/**
 * 
 * @ClassName:   HelloImpl 
 * @Description: TODO
 * @author       Mclaren Pan
 * @date         2014-10-8 下午11:11:40 
 *
 */
public class HelloImpl extends UnicastRemoteObject implements IHello {

	public HelloImpl() throws RemoteException {
		
	}
	
	public String helloWorld() throws RemoteException {
		// TODO Auto-generated method stub
		return "Hello World!";
	}

	public String sayHelloToSomeBody(String someBody) throws RemoteException {
		// TODO Auto-generated method stub
		return "你好, " + someBody + "!";
	}

}


HelloServer.java 服务端进行配置化,从rmi.conf读rmi的url和实现类,通过反射注册。

package com.mclaren.network.rmi;

import java.io.IOException;
import java.io.InputStream;
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 java.util.Properties;
/**
 * @ClassName:   HelloServer2 
 * @Description: TODO
 * @author       Mclaren Pan
 * @date         2014-10-8 下午1:29:33 
 *
 */
public class HelloServer {
	
	private static final String reg = ".*:(\\d+).*";

	private String url;
	
	private String port;
	
	private String implClz;
	
	public static void main(String[] args) {
		HelloServer server = new HelloServer();
		server.register();
	}
	
	private void initRmiConf() {
		InputStream is = this.getClass().getClassLoader().getResourceAsStream("rmi.conf");
		Properties prop = new Properties();
		try {
			prop.load(is);
		} catch (IOException e) {
			e.printStackTrace();
		}
		url = prop.getProperty("url");
		port = url.replaceAll(reg, "$1");
		implClz = prop.getProperty("implementClz");
	}
	
	public void register() {
		
		initRmiConf();
		
		try {
			Object implClzObj = Class.forName(implClz).newInstance();
			LocateRegistry.createRegistry(Integer.valueOf(port));
			Naming.bind(url, (Remote) implClzObj);
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NumberFormatException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (AlreadyBoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}		
	}
}

HelloClient.java

package com.mclaren.network.rmi;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;

/**
 * 
 * @ClassName:   HelloClient 
 * @Description: TODO
 * @author       Mclaren Pan
 * @date         2014-10-8 下午11:11:05 
 *
 */
public class HelloClient {
	public static void main(String[] args) {
		try {
			IHello rhello = (IHello) Naming.lookup("rmi://127.0.0.1:8889/RHello");
			System.out.println(rhello.helloWorld());
			System.out.println(rhello.sayHelloToSomeBody("jerry"));
		} catch (NotBoundException e) { 
            e.printStackTrace(); 
        } catch (MalformedURLException e) { 
            e.printStackTrace(); 
        } catch (RemoteException e) { 
            e.printStackTrace();   
        } 
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值