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程式設計師面試寶典



















其它文章

2016年2月13日 星期六

Java 晉升 Promotion 與 轉型 Casting

一、晉升(Promotion)
    在宣告變數的資料型態其儲存範圍比指定的數值之資料型態為大時,
    則會發生數值型態晉升的動作
    簡單的說,就是較小的資料型態會自動提昇為符合變數之資料型態
    例:
    long money = 10;

二、轉型轉型(Casting)
    如果確定要將資料型態大的值指定給資料型態小的變數,
    則您必須明確進行轉型(Casting)的動作
    使用括號()包括目標資料型態的關鍵字
    例:
    long money = 10;
    int smallMoney = (int) money;























其它文章

Java 特性

這篇Java 特性是我整理下來的,
給大家參考參考。


一、Java程式
撰寫程式副檔名為.java ,編譯後為副檔名為.class

二、Java語言是簡單的(Simple)
參考其它程式語言(例如C/C++),並移去了較為複雜或不容易掌控的部份,                  
例如:指標(Pointer),goto語法。

三、Java 物件(Object)
是個支援物件導向程式設計(Object-oriented Programming)(OOP)的程式語言

四、Java 皆為物件Object理念
程式安全的(Secure)
驗證所有 Java 程式是否擁有合法的程式碼
禁止使用指標來操控記憶體

五、多執行緒的(Multi-threaded)
同一時間執行多個以上的事情

六、跨平台(Platform-independent)
最重要的特點就是跨平台運行,
Java原始碼程式(*.java)只需在Java虛擬機器上
編譯器(Compiler)生成為位元碼(位元組碼Bytecode )
(*.class)檔案,就可以在多種平台上不加修改地執行。

                                                          圖片來源網路找來的。
資料來源網路上整理來的,希望對大家有幫助學習。























其它文章

Java 程式的註解


一、Java 程式的註解說明
分為三種:
    單行註解 //
    多行註解 /* ….*/
    文件註解 /**….*/ (又稱doc 註解)


二、程式
public class HelloWorld{//類別區塊開始
   public static void main(String[ ] args){//方法區塊開始
  //程式區塊
    System.out.println("我第一支Java程式!!");
  }//方法區塊結束
}//類別區塊結束





















其它文章

初學 Java 的 HelloWorld 程式


撰寫一個JAVA程式

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

public class HelloWorld 宣告一個公用類別(class)物件
檔名.java需跟類別名稱一樣
main(String[] args)主要方法java程式進入點
System.out.println 輸出訊息到console
程式行需用 ; 當結束符號

初學 Java 的 HelloWorld 程式




















其它文章

2016年2月5日 星期五

Java Constructor 建構子方法的使用

前言:
本文相關用詞
類別物件 (class)
方法 (method)
參數 (parameter)
回傳值 (return value)

一、什麼是 Constructor
Constructor 稱為: 建構子、建構子方法、建構方法

簡說明:類別物件建立構造的方法
圖1

程式例:
public class TestDemo {
 public TestDemo() {//Constructor
  //這是基本Constructor
 }
}

你是否要在創建時,做一下些事情。
如果沒有也可以不寫Constructor。
例如: 當你沒寫Constructor,也是可以創建類別物件成功。
public class TestDemo {
}


註:
當你沒有一個Constructor,才會自動產生基本Constructor。


二、何時會用到呢?
當你建立類別物件的時後就會用到了。
圖2

以下程式 new TestDemo();
public static void main(String[] args) {
  TestDemo testDemo = new TestDemo();
}

就在new TestDemo();
的TestDemo()這個關鍵方法。
就是初時建立物件叫用TestDemo()的Constructor 。



三、可以很多個Constructor 嗎?
可以。但要不同的參數。

例如
package test;

public class TestConstructorDemo {
 int age;
 String name;
 private TestConstructorDemo() {//Constructor
  System.out.println("創建TestConstructorDemo");
 }

 public TestConstructorDemo(int age) {//Constructor
  this.age = age;
  System.out.println("創建TestConstructorDemo,初值建立 ,age : "+ age);
 }
 
 public TestConstructorDemo(String name) {//Constructor
  this.name = name;
  System.out.println("創建TestConstructorDemo,初值建立 ,name : "+ name);
 }
 
 public TestConstructorDemo(int age,String name) {//Constructor
  this.age = age;
  this.name = name;
  System.out.println("創建TestConstructorDemo,初值建立, age : "+ age+", name : "+ name);
 }
 
 public void msg(){
  System.out.println("age : " + age + ", name : " + name);
 }

 public static void main(String[] args) {
  System.out.println("創建物件測試1 開始:");
  TestConstructorDemo testDemo1 = new TestConstructorDemo();
  testDemo1.msg();
  System.out.println("創建物件測試1 結束----------------");
  
  System.out.println("創建物件測試2 開始:");
  TestConstructorDemo testDemo2 = new TestConstructorDemo(25);
  testDemo2.msg();
  System.out.println("創建物件測試2 結束----------------");
  
  System.out.println("創建物件測試3 開始:");
  TestConstructorDemo testDemo3 = new TestConstructorDemo("levin");
  testDemo3.msg();
  System.out.println("創建物件測試3 結束----------------");
  
  System.out.println("創建物件測試4 開始:");
  TestConstructorDemo testDemo4 = new TestConstructorDemo(25,"levin");
  testDemo4.msg();
  System.out.println("創建物件測試4 結束----------------");
  
 }
}


測試結果:
圖3



相關同類參考:


Java 快速導覽 - 物件導向概念 建構子



Java Gossip: 建構方法(Constructor)



下一篇:
Java this方法的使用









































其它文章

標籤

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程式!!"); } } ...