1. 程式人生 > >java 遠端呼叫物件方法

java 遠端呼叫物件方法

原文:https://blog.csdn.net/teaandnoodle/article/details/52277935

RMI基本概念

RMI(Remote Method Invocation,遠端方法呼叫)是從java1.1開始實現的,它大大增強了Java開發分散式應用的能力。RMI對介面有著強烈的依賴,在需要建立一個遠端物件的時候,我們通過傳遞一個介面來隱藏基層的實施細節,所以客戶得到遠端物件的一個控制代碼時,它們真正得到的是介面控制代碼,然後原生代碼通過介面操作遠端物件。通過RMI編寫程式可以非常方便的實現分散式Java應用程式。

建立一個遠端介面時,必須遵守下列規則:

  1. 遠端介面必須為public屬性(不能是“包訪問”),否則一旦Client試圖裝載一個實現了遠端介面的遠端物件,就會得到一個錯誤;
  2. 遠端介面必須擴充套件(extends)介面java.rmi.Remote;
  3. 除了應用程式本身可能丟擲的Exception外,遠端介面中的每個方法還必須在自己的throws從句中宣告丟擲java.rmi.RemoteException(否則執行Server時會丟擲java.rmi.server.ExportException);
  4. 作為引數或返回值傳遞的一個遠端物件必須宣告為遠端介面,不可宣告為實現類。

RMI開發步驟

  1. 首先建立遠端介面並宣告遠端方法,需要繼承自java.rmi.Remote(Client和Server需要共享這個介面);
  2. 建立遠端介面的實現類,這個類必須繼承自java.rmi.server.UnicastRemoteObject(只有Server需要這個實現類,Client可以沒有);
  3. 編寫Server,繫結埠,註冊物件;
  4. 編寫Client,監聽埠並查詢物件。

例項

編寫基本的,要被傳輸的bean物件(Person),這個物件可以是基本資料型別或者實現了java.io.Serializable的自定義型別。

  1. package com.liu.models;  
  2. publicclass Person implements java.io.Serializable {  
  3.     privatestaticfinallong serialVersionUID = 1L;  
  4.     privateint id;  
  5.     private String name;  
  6.     privateint age;  
  7.     publicint getId() {  
  8.         return id;  
  9.     }  
  10.     publicvoid setId(int id) {  
  11.         this.id = id;  
  12.     }  
  13.     public String getName() {  
  14.         return name;  
  15.     }  
  16.     publicvoid setName(String name) {  
  17.         this.name = name;  
  18.     }  
  19.     publicint getAge() {  
  20.         return age;  
  21.     }  
  22.     publicvoid setAge(int age) {  
  23.         this.age = age;  
  24.     }  
  25.     public String toString() {  
  26.         return"id:" + getId() + " age:" + getAge() + " name:" + getName();  
  27.     }  
  28. }  

建立遠端介面PersonService,這個介面為Server和Client共有的,必須繼承自Remote,同時它的所有方法都必須丟擲java.rmi.RemoteException。

  1. package com.liu.models;  
  2. import java.rmi.Remote;  
  3. import java.rmi.RemoteException;  
  4. import java.util.List;  
  5. publicinterface PersonService extends Remote {  
  6.     public List<Person> getPersonList(int n) throws RemoteException;  
  7. }  

建立遠端介面的實現類PersionServiceImpl,需要繼承自UnicastRemoteObject,這個類只需要Server擁有即可。

  1. package com.liu.models;  
  2. import java.rmi.RemoteException;  
  3. import java.rmi.server.UnicastRemoteObject;  
  4. import java.util.List;  
  5. publicclass PersonServiceImpl extends UnicastRemoteObject implements PersonService{  
  6.     privatestaticfinallong serialVersionUID = 1L;  
  7.     public PersonServiceImpl() throws RemoteException {  
  8.         super();  
  9.     }  
  10.     @Override
  11.     public List<Person> getPersonList(int n) throws RemoteException {  
  12.         System.out.println("Get Persons");  
  13.         return Utils.createPersonList(n);  
  14.     }  
  15. }  

建立Server端程式碼,繫結特定埠,並註冊遠端介面的實現類。

  1. package com.liu.server;  
  2. import java.rmi.registry.LocateRegistry;  
  3. import javax.naming.Context;  
  4. import javax.naming.InitialContext;  
  5. import com.liu.models.PersonServiceImpl;  
  6. import com.liu.models.PersonService;  
  7. publicclass Server {  
  8.     publicstaticvoid main(String[] args) {  
  9.         try {  
  10.             PersonService personService = new PersonServiceImpl();  
  11.             LocateRegistry.createRegistry(6600);  
  12.             //這個方法也可以實現繫結
  13.             //Naming.rebind("rmi://127.0.0.1:6600/PersonService", personService);
  14.             Context namingContext = new InitialContext();  
  15.             namingContext.rebind("rmi://127.0.0.1:6600/PersonService", personService);  
  16.             System.out.println("Service Start!");  
  17.         } catch (Exception e) {  
  18.             e.printStackTrace();  
  19.         }  
  20.     }  
  21. }  

建立Client端程式碼,獲取遠端介面對應的遠端實現類,並通過遠端介面操作這個遠端介面。

  1. package com.liu.client;  
  2. import java.rmi.Naming;  
  3. import java.util.List;  
  4. import com.liu.models.Person;  
  5. import com.liu.models.PersonService;;  
  6. publicclass Client {  
  7.     publicstaticvoid main(String[] args){  
  8.         try{  
  9.             //遠端物件呼叫的埠和註冊類
  10.             PersonService personService=(PersonService)Naming.lookup("rmi://127.0.0.1:6600/PersonService");  
  11.             List<Person> personList = personService.getPersonList(5);  
  12.             for(Person person : personList){  
  13.                 System.out.println(person);  
  14.             }  
  15.         }catch(Exception ex){  
  16.             ex.printStackTrace();  
  17.         }  
  18.     }  
  19. }  

這裡還為實現類添加了一個輔助類用來隨機生成Person物件。

  1. package com.liu.models;  
  2. import java.util.ArrayList;  
  3. import java.util.List;  
  4. import java.util.Random;  
  5. import com.liu.models.Person;  
  6. publicclass Utils {  
  7.     publicstaticfinal Random rand = new

    相關推薦

    java 遠端呼叫物件方法

    原文:https://blog.csdn.net/teaandnoodle/article/details/52277935RMI基本概念RMI(Remote Method Invocation,遠端方法呼叫)是從java1.1開始實現的,它大大增強了Java開發分散式應用的

    java遠端呼叫WebService方法

    通過AXIS呼叫遠端的web service。已測可用。import javax.xml.rpc.ParameterMode; import org.apache.axis.client.Call;

    利用反射列印物件的所有屬性及呼叫物件方法

    利用java反射輸出物件的所有屬性,呼叫物件的方法 public class ClassUtil { private static final Logger logger = LoggerFactory.getLogger(ClassUtil.class); public s

    java呼叫start()方法呼叫run()方法的區別

    呼叫start()會開啟執行緒,讓開啟的執行緒去執行run()方法中的執行緒任務,此時無需等待run()方法執行完畢,即可繼續執行下面的程式碼。 呼叫run(),執行緒並未開啟,去執行run()的只有主執行緒,還是要順序指定,要等待run()方法體執行完畢後才可繼續執行下面的程

    java 遠端呼叫 rabbitmq

    新增管理員使用者,雖然預設(看起來是所有許可權)都有,實際依然雖然手工點選一下 (Set permission) 不然會提示一下錯誤 Exception in thread "main" java.io.IOException &n

    Java遠端呼叫shell指令碼(專案實戰)

    前言        Java遠端呼叫shell指令碼,需要用到SSH建立連結(類似於xshell連線linux),然後再根據合法的引數進行shell指令碼呼叫 1 首先,從業務層開始,我這裡實現重傳指令碼的業務,程式碼如下.       //重傳     public

    Java 遠端呼叫RMI 簡單例項之一

    這兩天在玩java的遠端呼叫,因為之前一直沒有接觸過,也沒有寫過demo。玩起來還是走了很多彎路的,在網上搜了很多blog,很多技術大牛的blog寫的很不錯,但對於新手來說,有些問題還是沒有講解清楚。花了蠻多時間,終於整理出自己的一個demo。因此附上,供以後學

    Java遠端呼叫系列(一)——概覽篇

    首先,來幾個基本問題 遠端呼叫是什麼(概念)? 內涵 定義: 本質上來講, 通俗來講, 外延(相關的易混概念) Java中的遠端 VS 客戶端和服務端的互動呼叫 遠端通訊 VS 遠端呼叫 VS 服務和服務的呼叫 遠端呼叫 VS 遠端過程呼叫 VS 遠端物件呼叫

    Java的匿名物件/方法

    匿名物件就是沒有明確給出名稱的物件.一般匿名物件只使用一次,而且匿名物件只在堆記憶體中開闢空間,而不存在棧記憶體的引用. class Person{ private String name ;

    JNI : Java程式呼叫C方法

    1、新建一個Java類名稱為:TestJavaCallC 2、在類中新增如下程式碼:   package Test; public class TestJavaCallC {     public native void sayHello();

    java遠端呼叫linux的命令或者指令碼

       Java通過SSH2協議執行遠端Shell指令碼(ganymed-ssh2-build210.jar)   使用步驟如下: 1.導包 官網下載: http://www.ganymed.ethz.ch/ssh2/ maven座標: [java] view plain copy print?

    java遠端呼叫linux上jar包

    首先在遠端伺服器上編寫一個測試指令碼test.sh,並賦予可執行許可權:chmod +x test.sh#!/bin/bash echo $1$1是指令碼傳進來的第一個引數,現在列印一下傳進來的第一個引數。在pom中新增依賴<dependency>    <

    Nodejs根據字串呼叫物件方法

    參考網站:http://blog.csdn.net/kiwi_coder/article/details/8592392 var kiwi = { name:'kiwi', say:function () { console.log("my

    Java 遠端呼叫之Hessian簡例

    1,匯入jar包 <dependency> <groupId>org.resthub</groupId> <artifactId>hessian&

    如何在java呼叫js方法

         有時候因為需要,我們想在java中呼叫js方法,不再是像頁面中一個事件觸發,該如何做到呢?今天下午沒事得時候小研究了下,現跟大家分享一下。不對之處,望大家指正,共同進步!     /* * 載入指令碼引擎,並在java中呼叫js方法 */ public void

    Java遠端呼叫BPS流程實現流程執行簡單示例

    1、簡介:略 2、背景:略 3、目的:自我學習筆記 4、實現過程 (1)、畫出流程圖 如下: 路由活動分支下的條件語句為複雜表示式: ((account<200&&divisionresult.equals("1"))||(account>=

    java遠端呼叫介面的原理和範例

    Java 遠端處理    Java遠端方法呼叫(RMI)提供了Java程式語言的遠端通訊功能,這種特性使客戶機上執行的程式可以呼叫遠端伺服器上的物件,使Java程式設計人員能夠在網路環境中分佈操作。    建立一個簡單的Java分散式遠端方法呼叫程式可以按以下幾個步驟操作,

    java怎樣呼叫DLL方法

        前段時間專案需要使用呼叫DLL來控制POS機外設,如錢箱和小票印表機、顧客顯示屏等,於是,我便開始了java呼叫DLL中的方法的探索,事實上,網上的例子還是很多的,一些外部包的例子也有很多,但每個人的實際情況都有所不同,儘管只是一個很簡單的呼叫,也花了我不少時間,在這

    java呼叫python方法

    import javax.script.*;   import org.python.util.PythonInterpreter;   import java.io.*;   importstatic java.lang.System.*;   publicclass FirstJavaScript

    redis在linux中安裝步驟以及java遠端呼叫redis

    redis在linux中安裝步驟: 1.安裝準備環境:安裝gcc yum install gcc-c++ 2.下載redis安裝包 wget http://download.redis.io/releases/redis-5.0.0.tar.gz 3.解壓redis tar