Java Rmi 远程方法调用

一: 服务端  暴露服务

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

/**
 * 1.定义远程接口,必须继承Remote接口,
 * 2.远程调用的方法必须抛出RemoteException异常 
 */
public interface ISayHello extends Remote {
	
	/**
	 * @param name
	 * @return
	 * @throws RemoteException  远程调用方法必须抛出RemoteException
	 */
	public String doSayHello(String name) throws RemoteException;
}

 

import java.rmi.RemoteException;
import com.xx.service.ISayHello;

/**
 * 远程接口实现
 */
public class ChinaSayHello implements ISayHello {

	public String doSayHello(String name) throws RemoteException {
		return "您好," + name;
	}
}
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.rmi.server.UnicastRemoteObject;

import com.xx.service.ISayHello;
import com.xx.service.impl.ChinaSayHello;

/**
 * 
 * 暴露远程服务
 */
public class ServerMain {
	
	public static void main(String[] args) {
		//创建远程对象
		ISayHello sayHello = new ChinaSayHello();
		//url
		String serviceUrl = "//localhost:9999/sayhello";
		//java 默认对口是1099
		final int registryPort = 9999;
		//暴露服务
		exporter(sayHello, registryPort, serviceUrl);
	}
	
	/**
	 * 暴露服务
	 * @param object
	 * @param registryPort
	 * @param serviceUrl
	 */
	public static void exporter(Remote object,int registryPort, String serviceUrl) {
		int servicePort = 0;
		try {
			UnicastRemoteObject.exportObject(object, servicePort);
			LocateRegistry.createRegistry(registryPort);
			Naming.bind(serviceUrl, object);
			System.out.println("绑定成功.");
		} catch (RemoteException e) {
			e.printStackTrace();
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (AlreadyBoundException e) {
			e.printStackTrace();
		}
	}
}


二:客户端  远程方法调用

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

import com.xx.service.ISayHello;

/**
 * 客户端
 */
public class ClientMain {
	
	public static void main(String[] args) throws RemoteException {
		// 查找远程对象 
		ISayHello sayHello= getObject(ISayHello.class, "rmi://localhost:9999/sayhello");
		// 远程方法调用
		System.out.println(sayHello.doSayHello("张三"));
	}
	
	public static <T> T getObject(Class<T> clazs, String serviceUrl) {
		try {
			Object object = Naming.lookup(serviceUrl);
			return clazs.cast(object);
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (RemoteException e) {
			e.printStackTrace();
		} catch (NotBoundException e) {
			e.printStackTrace();
		}
		throw new RuntimeException();
	}
}


 

posted on 2012-03-25 22:57  YangJin  阅读(174)  评论(0编辑  收藏  举报