java rmi淺談

首先比較下RPC和RMI的差異:java

首先java提供了RMI的api,jdk1.5以後虛擬機自動生成兩個類:存根類stub和骨架類skelton。 stub是給客戶端的,當客戶端調用遠程對象的一個方法時,其實是調用本地存根對象的相應方法。skelton負責在服務端爲遠程對象接受客戶端的請求。RMI必需要有JVM支持,因此,若是C,S都使用java開發,能夠考慮使用RMI。api

RPC能夠跨語言,客戶端請求參數中就帶有須要調用的類,方法及參數服務器

----------------------------------------以上是我的理解----------------------------------------------------ide

下面3個區別轉自:http://blog.csdn.net/shan9liang/article/details/8995023ui

(1)RPC 跨語言,而 RMI只支持Java。編碼

(2)RMI 調用遠程對象方法,容許方法返回 Java 對象以及基本數據類型,而RPC 不支持對象的概念,傳送到 RPC 服務的消息由外部數據表示 (External Data Representation, XDR) 語言表示,這種語言抽象了字節序類和數據類型結構之間的差別。只有由 XDR 定義的數據類型才能被傳遞, 能夠說 RMI 是面向對象方式的 Java RPC 。spa

(3)在方法調用上,RMI中,遠程接口使每一個遠程方法都具備方法簽名。若是一個方法在服務器上執行,可是沒有相匹配的簽名被添加到這個遠程接口上,那麼這個新方法就不能被RMI客戶方所調用。.net

在RPC中,當一個請求到達RPC服務器時,這個請求就包含了一個參數集和一個文本值,一般造成「classname.methodname」的形 式。這就向RPC服務器代表,被請求的方法在爲 「classname」的類中,名叫「methodname」。而後RPC服務器就去搜索與之相匹配的類和方法,並把它做爲那種方法參數類型的輸入。這裏 的參數類型是與RPC請求中的類型是匹配的。一旦匹配成功,這個方法就被調用了,其結果被編碼後返回客戶方。code

 

遠程對象需繼承Remote接口,每一個方法都須要throws RemoteException, 經過此接口提供業務功能,而後將其綁定到某個端口上提供遠程服務server

public interface Business extends Remote {
    public String echo(String message) throws RemoteException;
}
public class BusinessImpl implements Business {

    @Override
    public String echo(String message) throws RemoteException {
        if("quit".equalsIgnoreCase(message)){
            System.out.println("server will be shut down");
            System.exit(0);
        }
        return "server response" + message;
    }
}

server:

public class Server {
    public static void main(String[] args) throws RemoteException{
        int port = 1233; //該端口負責提供服務
        String name = "BusinessDemo";
        Business business = new BusinessImpl();
        UnicastRemoteObject.exportObject(business,port);  //若是BusinessImpl繼承了UnicastRemoteObject  這行代碼能夠不寫
        Registry registry = LocateRegistry.createRegistry(1234); //該端口負責註冊與查詢服務,客戶端只須要知道這個端口號就好了
        registry.rebind(name, business);
    }
}

client:

public class Client {
    public static void main(String[] args) throws RemoteException, NotBoundException{
        Registry registry = LocateRegistry.getRegistry("127.0.0.1",1234); //若是cs要布在兩臺機器上,這兒的ip填server的ip便可
        String name = "BusinessDemo";
        Business business = (Business) registry.lookup(name); //執行到這兒的時候才訪問server
        System.out.print(business.echo("hello"));
    }
}
相關文章
相關標籤/搜索