Java RMI那點事兒:初識HelloWorld

Java RMI 指的是遠程方法調用 (Remote Method Invocation)。它是一種機制,可以讓在某個 Java 虛擬機上的對象調用另外一個Java 虛擬機中的對象上的方法。能夠用此方法調用的任何對象必須實現該遠程接口。
 
Java RMI不是什麼新技術(在Java1.1的時代都有了),但倒是是很是重要的底層技術。
大名鼎鼎的EJB都是創建在rmi基礎之上的,如今還有一些開源的遠程調用組件,其底層技術也是rmi。
 
在大力鼓吹Web Service、SOA的時代,是否是每一個應用都應該選用笨拙的Web Service組件來實現,經過對比測試後,RMI是最簡單的,在一些小的應用中是最合適的。 java

下面經過一個簡單的例子來講明RMI的原理和應用,下面這個例子是一個簡單HelloWorld,但已涵蓋RMI的核心應用與開發模式。 服務器

package com.jason.rmi;

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

public interface Hello extends Remote{
	
    public String sayHello() throws RemoteException;

	public String sayHelloToSomeOne(String someOneName) throws RemoteException;
}
package com.jason.rmi;

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

public class HelloImpl extends UnicastRemoteObject implements Hello {

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

	public HelloImpl() throws RemoteException {
		super();
		// TODO Auto-generated constructor stub
	}

	@Override
	public String sayHello() throws RemoteException {
		// TODO Auto-generated method stub
		return "HelloJasonlee";
	}

	@Override
	public String sayHelloToSomeOne(String someOneName) throws RemoteException {
		// TODO Auto-generated method stub
		return "你好!"+someOneName;
	}

}
package com.jason.rmi.test;

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

import com.jason.rmi.Hello;
import com.jason.rmi.HelloImpl;

public class RmiServer {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try { 
            //建立一個遠程對象 
            Hello hello = new HelloImpl(); 
            //本地主機上的遠程對象註冊表Registry的實例,並指定端口爲8888,這一步必不可少(Java默認端口是1099),必不可缺的一步,缺乏註冊表建立,則沒法綁定對象到遠程註冊表上 
            LocateRegistry.createRegistry(8888); 

            //把遠程對象註冊到RMI註冊服務器上,並命名爲Hello 
            //綁定的URL標準格式爲:rmi://host:port/name(其中協議名能夠省略,下面兩種寫法都是正確的) 
            Naming.bind("rmi://localhost:8888/Hello",hello); 
//            Naming.bind("//localhost:8888/Hello",hello); 

            System.out.println(">>>>>INFO:遠程Hello對象綁定成功!"); 
        } catch (RemoteException e) { 
            System.out.println("建立遠程對象發生異常!"); 
            e.printStackTrace(); 
        } catch (AlreadyBoundException e) { 
            System.out.println("發生重複綁定對象異常!"); 
            e.printStackTrace(); 
        } catch (MalformedURLException e) { 
            System.out.println("發生URL畸形異常!"); 
            e.printStackTrace(); 
        } 
	}

}
package com.jason.rmi.test;

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

import com.jason.rmi.Hello;

public class RmiClient {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			// 在RMI服務註冊表中查找名稱爲Hello的對象,並調用其上的方法,在服務端實際引用的對象是HelloImpl對象;
			Hello hello = (Hello) Naming.lookup("rmi://localhost:8888/Hello");
			System.out.println(hello.sayHello());
			System.out.println(hello.sayHelloToSomeOne("傑森"));
		} catch (NotBoundException e) {
			e.printStackTrace();
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (RemoteException e) {
			e.printStackTrace();
		}
	}

}

在eclipse下的環境以下: eclipse

在eclipse下的運行結果以下: ide

相關文章
相關標籤/搜索