最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java RMI詳細介紹及實例講解

 更新時間:2020年07月23日 10:05:03   作者:yehx  
這篇文章主要介紹了java RMI詳細介紹及實例講解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

  java本身提供了一種RPC框架——RMI(即RemoteMethodInvoke遠程方法調(diào)用),在編寫一個接口需要作為遠程調(diào)用時,都需要繼承了Remote,Remote接口用于標識其方法可以從非本地虛擬機上調(diào)用的接口,只有在“遠程接口”(擴展java.rmi.Remote的接口)中指定的這些方法才可遠程使用,下面通過一個簡單的示例,來講解RMI原理以及開發(fā)流程:

  為了真正實現(xiàn)遠程調(diào)用,首先創(chuàng)建服務端工程rmi-server,結(jié)構(gòu)如下:

 

  代碼說明:

  1.User.java:用于遠程調(diào)用時pojo對象的傳輸,該對象必須實現(xiàn)Serializable接口,否則在調(diào)用過程中,會拋出NotSerializableException異常,代碼如下:

/**
 * 用戶信息,用于遠程調(diào)用傳輸,必須實現(xiàn)Serializable接口
 * 
 * @author andy
 *
 */
public class User implements Serializable {
  private static final long serialVersionUID = 1L;

  private String name;

  private int age;

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public int getAge() {
    return age;
  }

  public void setAge(int age) {
    this.age = age;
  }

  @Override
  public String toString() {
    return "name : " + this.name + ", age : " + this.age;
  }
}

  2.Hello.java:遠程接口,該接口需要繼承Remote接口,并且接口中的方法全都要拋出RemoteException異常,代碼如下:

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

import pers.andy.rmi.bean.User;

/**
 * 定義一個遠程接口,必須繼承Remote接口,其中需要遠程調(diào)用的方法必須拋出RemoteException異常
 * 
 * @author andy
 *
 */
public interface IHello extends Remote {

  /**
   * 更新user信息
   * @param user
   * @return
   * @throws RemoteException
   */
  public User updateUser(User user) throws RemoteException;
}

  3.HelloImpl:遠程接口實現(xiàn)類,必須繼承UnicastRemoteObject(繼承RemoteServer->繼承RemoteObject->實現(xiàn)Remote,Serializable),只有繼承UnicastRemoteObject類,才表明其可以作為遠程對象,被注冊到注冊表中供客戶端遠程調(diào)用(補充:客戶端lookup找到的對象,只是該遠程對象的Stub(存根對象),而服務端的對象有一個對應的骨架Skeleton(用于接收客戶端stub的請求,以及調(diào)用真實的對象)對應,Stub是遠程對象的客戶端代理,Skeleton是遠程對象的服務端代理,他們之間協(xié)作完成客戶端與服務器之間的方法調(diào)用時的通信。),代碼如下:

/**
 * 遠程的接口的實現(xiàn),繼承了UnicastRemoteObject,表明該類作為一個遠程對象
 * 
 * @author andy
 *
 */
public class HelloImpl extends UnicastRemoteObject implements IHello {
  /**
   * 
   */
  private static final long serialVersionUID = 1L;

  /**
   * 因為UnicastRemoteObject的構(gòu)造方法拋出了RemoteException異常,因此這里默認的構(gòu)造方法必須寫,必須聲明拋出RemoteException異常
   * 
   * @throws RemoteException
   */
  public HelloImpl() throws RemoteException {
  }

  public User updateUser(User user) throws RemoteException {
    System.out.println("-------------- 客戶端發(fā)送的user為" + user.toString());
    user.setName("andy2");
    user.setAge(30);
    return user;
  }
}

  4.HelloServer:服務端啟動類,用于創(chuàng)建遠程對象注冊表以及注冊遠程對象,代碼如下:

/**
 * 服務端啟動類
 * 
 * @author andy
 *
 */
public class HelloServer {
  public static void main(String args[]) {
    try {
       // 本地主機上的遠程對象注冊表Registry的實例,并指定端口為8888,這一步必不可少(Java默認端口是1099)
      LocateRegistry.createRegistry(8888);
      // 把遠程對象注冊到RMI注冊服務器上,并命名為RHello
      // 綁定的URL標準格式為:rmi://host:port/name(其中協(xié)議名可以省略,下面兩種寫法都是正確的)
      Naming.bind("rmi://localhost:8888/RHello", rhello);
      // Naming.bind("http://localhost:8888/RHello",rhello);
      System.out.println("------------遠程對象IHello注冊成功,等待客戶端調(diào)用...");
    } catch (RemoteException e) {
      System.out.println("創(chuàng)建遠程對象發(fā)生異常!");
      e.printStackTrace();
    } catch (AlreadyBoundException e) {
      System.out.println("發(fā)生重復綁定對象異常!");
      e.printStackTrace();
    } catch (MalformedURLException e) {
      System.out.println("發(fā)生URL畸形異常!");
      e.printStackTrace();
    }
  }
}

  補充說明:為何HelloImpl繼承了UnicastRemoteObject就可以被作為遠程對象發(fā)布,查閱UnicastRemoteObject的源碼可以發(fā)現(xiàn):

protected UnicastRemoteObject() throws RemoteException
  {
    this(0);
  }
  protected UnicastRemoteObject(int port) throws RemoteException
  {
    this.port = port;
    exportObject((Remote) this, port);
  }

  其實在啟動server端的時候,new了HelloImpl對象,因為繼承了UnicastRemoteObject,會先調(diào)用父類的構(gòu)造方法,這時候,就會將this(當前對象)通過exportObject方法注冊。

  所以,如果在被導出的對象需要繼承其它的類,那么就可以不采用集成UnicastRemoteObject的方式,而是通過exportObject方法將其導出為遠程對象:

...
// 創(chuàng)建一個遠程對象
IHello rhello = new HelloImpl();
//HelloImpl不需要繼承UnicastRemoteObject類,通過exportObject將其顯示導出
UnicastRemoteObject.exportObject(rhello,0);
...

  以上即是服務端所有代碼,接下來是創(chuàng)建客戶端工程,結(jié)構(gòu)如下:

  實際應用開發(fā)中,客戶端的User.java和IHello.java應該是從服務端導出jar包的形式添加到依賴庫里,因此這邊只介紹HelloClient.java,該類為客戶端啟動類,用于在注冊表中查找遠程對象實現(xiàn)遠程方法調(diào)用,代碼如下:

/**
 * 客戶端啟動類
 * 
 * @author andy
 *
 */
public class HelloClient {
  public static void main(String args[]) {
    try {
      // 在RMI服務注冊表中查找名稱為RHello的對象,并調(diào)用其上的方法
      IHello rhello = (IHello) Naming.lookup("rmi://localhost:8888/RHello");       // 構(gòu)造user對象,測試遠程對象傳輸
      User user = new User();
      user.setAge(20);
      user.setName("andy");
      System.out.println("-------------- 服務端返回的的user為" + rhello.updateUser(user).toString());
    } catch (NotBoundException e) {
      e.printStackTrace();
    } catch (MalformedURLException e) {
      e.printStackTrace();
    } catch (RemoteException e) {
      e.printStackTrace();
    }
  }
}

  到此為止,客戶端和服務端的工程都搭建完畢,現(xiàn)在可以進行測試,執(zhí)行次序和測試結(jié)果如下所示:

  1.首先運行服務端啟動類HelloServer,結(jié)果如下:

  服務端:------------遠程對象IHello注冊成功,等待客戶端調(diào)用...

  2.運行客戶端啟動類,結(jié)果如下:

  服務端:-------------- 客戶端發(fā)送的user為name : andy, age : 20
       客戶端:-------------- 服務端返回的的user為name : andy2, age : 30

 到此這篇關(guān)于java RMI詳細介紹及實例講解的文章就介紹到這了,更多相關(guān)java RMI 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • 盤點MQ中的異常測試

    盤點MQ中的異常測試

    這篇文章主要為大家介紹了盤點MQ中的異常測試,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • Java如何實現(xiàn)壓縮文件與解壓縮zip文件

    Java如何實現(xiàn)壓縮文件與解壓縮zip文件

    這篇文章主要介紹了Java如何實現(xiàn)壓縮文件與解壓縮zip文件問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Java實現(xiàn)Redis分布式鎖的三種方案匯總

    Java實現(xiàn)Redis分布式鎖的三種方案匯總

    setnx、Redisson、RedLock?都可以實現(xiàn)分布式鎖,從易到難得排序為:setnx?<?Redisson?<?RedLock,本文為大家整理了三種方法的實現(xiàn),希望對大家有所幫助
    2023-11-11
  • SpringMVC之@InitBinder注解詳解

    SpringMVC之@InitBinder注解詳解

    這篇文章主要介紹了SpringMVC之@InitBinder注解詳解,springmvc并不是能對所有類型的參數(shù)進行綁定的,如果對日期Date類型參數(shù)進行綁定,就會報錯IllegalStateException錯誤,需要的朋友可以參考下
    2024-01-01
  • Java使用IOC控制反轉(zhuǎn)的三種設計模式詳解

    Java使用IOC控制反轉(zhuǎn)的三種設計模式詳解

    這篇文章主要為大家詳細介紹了Java使用IOC控制反轉(zhuǎn)的三種設計模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • JDK動態(tài)代理與CGLib動態(tài)代理的區(qū)別對比

    JDK動態(tài)代理與CGLib動態(tài)代理的區(qū)別對比

    今天小編就為大家分享一篇關(guān)于JDK動態(tài)代理與CGLib動態(tài)代理的區(qū)別對比,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • Selenium處理select標簽的下拉框

    Selenium處理select標簽的下拉框

    Selenium是一個開源的和便攜式的自動化軟件測試工具,用于測試Web應用程序有能力在不同的瀏覽器和操作系統(tǒng)運行。接下來通過本文給大家介紹Selenium處理select標簽的下拉框,需要的朋友一起學習吧
    2016-04-04
  • 詳解Java分布式系統(tǒng)中session一致性問題

    詳解Java分布式系統(tǒng)中session一致性問題

    這篇文章主要介紹了Java分布式系統(tǒng)中session一致性問題,對分布式系統(tǒng)感興趣的同學,要仔細看一下
    2021-04-04
  • JavaWeb之Filter與Listener使用解析

    JavaWeb之Filter與Listener使用解析

    這篇文章主要介紹了JavaWeb之Filter與Listener使用解析,Filter表示過濾器,是JavaWeb三大組件(Servlet、Filter、Listener)之一,過濾器可以把對資源的請求攔截下來,從而實現(xiàn)一些特殊的功能,需要的朋友可以參考下
    2024-01-01
  • springboot統(tǒng)一異常處理(返回json)并格式化異常

    springboot統(tǒng)一異常處理(返回json)并格式化異常

    這篇文章主要介紹了springboot統(tǒng)一異常處理(返回json)并格式化異常,對spring boot的默認異常處理方式進行修改,要統(tǒng)一返回數(shù)據(jù)格式,優(yōu)雅的數(shù)據(jù)交互,優(yōu)雅的開發(fā)應用,需要的朋友可以參考下
    2023-07-07

最新評論

浙江省| 临高县| 长葛市| 长岭县| 特克斯县| 宣汉县| 枞阳县| 凉山| 长兴县| 夏河县| 东至县| 文昌市| 重庆市| 宜兰市| 吉林省| 永春县| 江北区| 清新县| 云阳县| 湟源县| 资中县| 楚雄市| 岚皋县| 新竹市| 马公市| 临湘市| 神农架林区| 正定县| 井陉县| 佛山市| 遂宁市| 瓦房店市| 洛隆县| 沙湾县| 高台县| 麻江县| 淳安县| 定结县| 黄骅市| 奎屯市| 习水县|