2016年2月27日 星期六

Java RMI HelloWorld

Java RMI (Remote Method Invocation) 遠程方法調用。
它是一種機制,能夠讓在某個 Java 虛擬機上的對象調用另一個 Java 虛擬機中的對像上的方法。

Java RMI不是什麼新技術(在Java1.1的就有了),但卻是是非常重要的底層技術。

EJB也建立在rmi基礎之上的,有一些開源的遠程調用組件,其底層技術也是rmi。




Server端:
一、建立註冊表Registry的實體
在本地主機上的遠程對象註冊表Registry的實體,並指定端口為8888, 這一步不可少的(Java默認端口是1099), 缺少註冊表創建,則無法綁定對像到遠程註冊表上。 java.rmi.registry.LocateRegistry; LocateRegistry.createRegistry(8888);

二、遠程物件的註冊
把遠程物件註冊到RMI註冊服務器上,並命名為hello 綁定的URL標準格式為:rmi://host:port/name (下面兩種寫法都是可以的) import java.rmi.Naming; Naming.bind("rmi://localhost:8888/hello", hello); or Naming.bind("//localhost:8888/hello", hello);

三、遠程物件定義介面

定義一個遠程介面,必須繼承Remote介面,其中需要遠程調用的方法必須拋出RemoteException異常 public interface IHello extends Remote {

四、遠程的介面實作

必須繼承 UnicastRemoteObject ,必須拋出RemoteException異常 public class HelloImpl extends UnicastRemoteObject implements IHello {

五、專案程式
圖1

本專案共有4支。

HelloServer.java :Server需要的 HelloImpl.java :Server需要的 IHello.java :Server、Client需要的 HelloClient.java :Client需要的
Server端: HelloServer.java
package com.rmi.test;

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

/**
 * 創建RMI註冊表,啟動RMI服務,並將遠程對象註冊到RMI註冊表中。
 *
 * @author levin 2015/12/3 下午11:16:36
 *
 */
public class HelloServer {
 public static void main(String args[]) {

  try {
   // 創建一個遠程對象
   IHello 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:遠程IHello對象綁定成功!");
  } 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();
  }
 }
}
IHello.java :Server、Client需要的
package com.rmi.test;

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

/**
 * 定義一個遠程接口,必須繼承Remote接口,其中需要遠程調用的方法必須拋出RemoteException異常
 *
 * @author levin 2015/12/3 下午11:17:19
 *
 */
public interface IHello extends Remote {
 /**
  * 簡單的返回"Hello World!"字串
  *
  * @return 返回"Hello World!"字串
  * @throws java.rmi.RemoteException
  */
 public String helloWorld() throws RemoteException;
}
HelloImpl.java :Server需要的
package com.rmi.test;

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

/**
 * 遠程的接口的實現
 *
 * @author levin 2015/12/3 下午11:19:23
 *
 */
public class HelloImpl extends UnicastRemoteObject implements IHello {
 private static final long serialVersionUID = 3509127927099606368L;

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

 public String helloWorld() throws RemoteException {
  return "Hello World!";
 }
}
HelloClient.java :Client需要的
package com.rmi.test;

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

/**
 * 客戶端測試,在客戶端調用遠程對像上的遠程方法,並返回結果。
 *
 * @author levin 2015/12/3 下午11:16:36
 *
 */
public class HelloClient {

 public static void main(String args[]) {
  try {
   // 在RMI服務註冊表中查找名稱為hello的對象,並調用其上的方法
   IHello rhello = (IHello) Naming.lookup("rmi://localhost:8888/hello");
   System.out.println(rhello.helloWorld());
  } catch (NotBoundException e) {
   e.printStackTrace();
  } catch (MalformedURLException e) {
   e.printStackTrace();
  } catch (RemoteException e) {
   e.printStackTrace();
  }
 }
}

六、執行程式
Server端:
圖2

Client端:
圖1


推薦書品:
Java分散式處理實務精要:奠定雲端基礎的63個思考術

求職加分!進入IT產業必讀的324個 Java面試決勝題:從求職準備、面試流程、開發心得、重點回顧到經典試題的完整剖析

我的Java程式比你的快10倍:從概念到工具的極度優化

Java 效能優化指南

Java程式設計師面試寶典



















其它文章

沒有留言:

張貼留言

標籤

Oracle (150) Oracle DB (144) Oracle_DB (143) Oracle SQL (135) JAVA (84) css-基本類 (65) MySQL (59) CSS Selector (58) jQuery (49) JavaScript-基本類 (39) Spring Boot (38) JavaScript (37) JavaScript HTML DOM (37) JavaScript-HTML_DOM (36) CSS3 (30) JAVA-基本類 (28) jQuery UI (27) Apache (23) Oracle GROUP BY (20) datepicker (20) Android (18) Oracle Date (17) c (17) JAVA-lang套件 (16) Linux (16) Oracle Sub Query (16) Spring-基本類 (16) jQuery-基本類 (16) MySQL-進階系列教學 (15) Android基本類 (14) Grails (14) Oracle join (14) SQLite (13) Spring (13) WIN7-基本類 (13) grails-基本類 (13) linux cent os (13) CKEditor (12) JAVA-流程控制類 (12) JAVA_Spring (12) PHP (11) Spring MVC (11) MySQL-基本系列教學 (10) Notepad (10) Notepad++ (10) SQLite for java (10) Windows (10) c/c++ (10) eclipse (9) jQuery-Selector (9) sqldeveloper (9) DB_Toad (8) JAVA_IDE_Eclipse (8) JavaScript-String類 (8) MySQL DB Toad (8) MySQL-DATE相關 (8) MySQL-函式相關 (8) Spring Bean (8) Android Studio (7) HTML5 (7) Hibernate (7) JAVA-OCWCD (7) JavaScript-陣列類 (7) Docker (6) JAVA-程式分享 (6) JAVA.util套件 (6) JavaScript-數學類 (6) MinGw (6) MySQL-其它類 (6) Servlet (6) centos (6) Apache_Tomcat (5) Apache套件_POI (5) CSS (5) JavaScript-Date物件 (5) JavaScript-其它類 (5) PostgreSQL (5) httpd (5) log4j (5) 基本資訊 (5) 開發工具 (5) CSS Properties (4) Dev-C++ (4) IntelliJ IDEA (4) Oracle DDL (4) Sublime (4) TortoiseSVN (4) apache_Maven (4) Android NDK (3) Eclipse IDE for C/C++ (3) Hibernate-基本類 (3) JAVA-問題 (3) JAVA-綀習分享 (3) JVM (3) Linux 指令 (3) Proxy Server (3) Spring Mobile (3) Spring web (3) Squid (3) VirtualBox (3) maven (3) zk (3) 生活其它 (3) Bootstrap (2) Filter (2) JAVA_IO (2) JAVA_其它_itext套件 (2) JBoss-問題 (2) JSP (2) Jboss (2) Listener (2) MySQL-語法快速查詢 (2) Spring AOP (2) Spring Batch (2) Spring Boot Actuator (2) Spring i18n (2) Subversive (2) Tomcat 8 (2) UML (2) WebJars (2) WinMerge (2) c++ (2) c語言綀習題 (2) jQuery Mobile (2) jQuery-事件處理 (2) jQuery-套件類 (2) putty (2) svn (2) weblogic (2) Apache_JMeter (1) Apache套件_BeanUtils (1) Apache套件_StringUtils (1) Base64 (1) Google API (1) HTML5-基本類 (1) Heap (1) JAVA 7 (1) JAVA SE 、JAVA EE、JAVA ME (1) JAVA 日期 (1) JAVA-OCJP (1) JAVA-WEB (1) JAVA_IDE (1) JAVA其它 (1) JBoss Server (1) JDK (1) JMX (1) JRE (1) Java RMI (1) Java String (1) Joda Time (1) Linux_其它 (1) MySQL教學 (1) Oracle_VirtualBox (1) SQL Server (1) SWT (1) Session (1) Stack (1) Struts 2 (1) Tool (1) ZK Studio (1) csv (1) grails-其它類 (1) jQuery-進階 (1) java mail (1) java web (1) java8 (1) jsoup (1) mockmvc (1) modules (1) tomcat (1) win10 (1) 其它類 (1) 圖片工具 (1) 模擬器 (1) 讀書分享 (1) 開發資訊 (1)

精選文章

初學 Java 的 HelloWorld 程式

撰寫一個JAVA程式 public class HelloWorld{ public static void main(String[ ] args){ System.out.println("我第一支Java程式!!"); } } ...