麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

使用RMI進行分布式交互

2019-11-14 14:53:13
字體:
來源:轉載
供稿:網友

內容概要

  • RMI 示例
  • RMI 架構
  • RMI API
  1. Remote    
  2. RemoteException
  3. Registry, LocateRegistry
  4. Naming

 

 

RMI 示例

 在了解RMI之前,先來看一個例子:

// 服務接口package com.fjn.java.rmi.quickstart.server;import java.rmi.Remote;import java.rmi.RemoteException;public interface Hello extends Remote{    public String sayHello(String str) throws RemoteException;}// 服務實現package com.fjn.java.rmi.quickstart.server;import java.io.Serializable;import java.rmi.RemoteException;public class HelloImpl implements Hello, Serializable {    PRotected HelloImpl() throws RemoteException {       super();    }    private static final long serialVersionUID = 3556503295294925414L;    @Override    public String sayHello(String str) {       return "Hello, "+str;    }} // Server端發布服務:package com.fjn.java.rmi.quickstart.server;import java.net.MalformedURLException;import java.rmi.AlreadyBoundException;import java.rmi.NotBoundException;import java.rmi.RemoteException;import java.rmi.registry.LocateRegistry;import java.rmi.registry.Registry;import java.rmi.server.UnicastRemoteObject; public class ServerTest {    public static void main(String[] args) throws RemoteException, AlreadyBoundException, InterruptedException, MalformedURLException, NotBoundException {       // 創建Registry       Registry registry=LocateRegistry.createRegistry(9998);            Hello stub=(Hello) UnicastRemoteObject.exportObject(new HelloImpl(),0);       // 將ref綁定到registry中       registry.rebind("Hello", stub);       Hello stub2=(Hello)registry.lookup("Hello");       System.out.println(stub2);       Thread.sleep(1000*60*60);    }}

執行結果:

Hello, zhang sanHello, Zhang san

 

RMI 架構

 

       上面的這個圖表示了RMI的架構圖,設計說明:Server端只需向一個登記處(Registry)為一個遠程對象注冊名字(唯一),然后就可以等待客戶端來使用了。客戶端要調用一個遠程方法前,先去登記處(Registry)look up(根據name),找到相應的對象(找到的是對象的引用),然后在客戶端進行方法調用。因為客戶端拿到的是遠程對象的引用,所以就像是直接調用一樣。

        在有些情況下,客戶端會從服務端取一此Class的bytecode,服務端同樣也會從客戶端取一些類的bytecode。這樣做的前提是,對方那里有Web Server。獲取時使用都是URL協議:URL protocol (e.g., HTTP, FTP, file, etc.) 。

 

RMI API

Remote

The Remote interface serves to identify interfaces whose methods may be invoked from a non-local virtual machine. Any object that is a remote object must directly or indirectly implement this interface. Only those methods specified in a "remote interface", an interface that extends java.rmi.Remote are available remotely.

       在這個接口中,沒有任何方法。這個接口只是一個標記作用,標記那些可以在非本地使用的接口。也就是說,如果這個接口可以被RMI客戶端使用,就必須extends這個接口,或者Remote的子接口。

 將實現了Remote接口的對象稱為遠程對象。RMI用于分布式程序,因此也將遠程對象稱為分布式對象。

 

遠程接口的設計原則

1)必須繼承Remote接口

2)在遠程接口中聲明的方法必須滿足下列要求:

       A:方法必須拋出java.rmi.RemoteException(IOException,Exception也可以,因為這兩個異常是RemoteException的父類)。

       B:遠程方法的聲明中:如果遠程對象出現參數或者返回值中,那么得使用遠程接口本身。

3)遠程接口如果也繼承了其他的非遠程接口,只要遠程方法滿足2)中的要求即可。作為遠程接口本身,要繼承Remote接口,在這個遠程接口中直接聲明的方法要滿足2)中的要求。從非遠程接口中繼承來的方法也得滿足2)中的要求。

4)接口的實現,必須實現Serializable接口。

 

RemoteException

       為了保證遠程調用時,程序的正常進行,需要對每一個遠程方法都拋出RemoteException,或者它的父類:IOException、Exception。

 

何時會拋出RemoteException?

1)  協議錯誤時

2)  通信失敗時(Server拒絕請求,或者沒有連接成功)

3)  參數或者接口在marshall、unmarshall過程中出現問題

 

Registry、LocateRegistry

 

在前面已經知道Registry是一個登記處。用于登記提供的遠程服務的。

Registry類提供了一些存儲、獲取遠程對象(在存儲時,遠程對象的引用會與一個name綁定,name是唯一的,所以獲取時可以根據name來獲取)。

 

提供了下列方法:

 

 bind、unbind、rebind 用于將遠程對象與指定的name進行綁定和解綁。

list:用于列出已綁定的遠程對象的name。返回結果是數組。

另外有一點很重要,在Registry中存儲的是stub對象。而正在的對象是在RMI Server上。

當客戶端通過Naming或者Registry查找(loopup)到的都是對象的stub。然后利用Stub的序列化與反序列化功能進行Client與Server端通信。

 

LocateRegistry與Registry的關系

LocateRegistry是用于定位Registry在網絡上的位置的,知道Registry在網絡上的位置,就能取得Registry對象,根據Registry對象就可以找到要使用的遠程對象,找到遠程對象就可以去調用遠程方法了。

 

Naming

 

Naming類提供了一些存儲和獲取遠程對象(存儲在Registry中的)的引用的方法。

提供的方法有:

 

 

提供的方法中,都有一個name參數,是字符串類型的。它是有一個標準的格式(是一個URL,但是少了URL中的schema部分,schema是rmi)。格式為:

//host:port/name 或者 rmi://host:port/name

 

Host就是定位到的Registry的host,端口也是。

從提供的方法上來看,Naming就是一個工具類,它提供的方法都是靜態的,但是方法確實和Registry中的方法是一樣的。如此,目前就學習了兩種獲取、綁定遠程對象的方法了。

也就是說Registry在客戶端和服務端都是可用的。綁定用于服務端,獲取用于客戶端。

 

方式一:使用Registry綁定或者獲取一個遠程對象的stub。方式二:直接使用Naming來綁定或者獲取一個遠程對象的stub。

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 电影一级毛片 | 中文字幕亚洲视频 | 久久精品中文字幕一区二区三区 | 亚洲电影在线播放 | 亚洲影院在线播放 | 久久久久久久久久久久久久av | 欧日韩在线视频 | 欧美特一级| 久久综合综合 | 中文字幕精品亚洲 | 国产精品久久久久久久久久东京 | 精品国产乱码久久久久久久 | 日日碰日日操 | 娇妻被各种姿势c到高潮小说 | 日日草夜夜 | 欧美一区二区三区中文字幕 | 中国av免费在线观看 | 午夜神马电影网 | 欧美一级精品片在线看 | 免费的毛片 | 久久精品99北条麻妃 | 亚洲精品久久久久久久久久久 | 国产成人精品一区二区视频免费 | 毛片福利| 亚洲骚图 | 欧美一级高清片在线 | 欧美激情精品久久久久久黑人 | 国产亚洲精品久久久久久久久久 | 国产精品成年片在线观看, 激情小说另类 | 18欧美性xxxx极品hd | 青久草视频 | 欧美成年性h版影视中文字幕 | 一级视频网站 | 国产一区国产二区在线观看 | av电影免费观看 | 国产精品一区二区三区在线 | 色欧美视频 | 久久密 | 偿还电影免费看 | 国产一区二区三区视频观看 | 精品国产一区二区三区蜜殿 |