國岷善化高中 蕭嘉岙蕭嘉岙 老窯 -...

32
2012/2/10 100 年度教案 年度教案 年度教案 年度教案題 題:Java 物導網路程式設 物導網路程式設 物導網路程式設 物導網路程式設 國善化高中 國善化高中 國善化高中 國善化高中 蕭嘉 蕭嘉 蕭嘉 蕭嘉 100 12 10 Java 物導網路程式設(一).................................................. 1 Java 物導網路程式設(二).................................................. 7 Java 物導網路程式設(三)................................................. 12 Java 物導網路程式設()................................................. 22

Upload: others

Post on 05-Aug-2020

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 國岷善化高中 蕭嘉岙蕭嘉岙 老窯 - tn.edu.twicerc.tnssh.tn.edu.tw/download/tm/100-1-5.pdf · 過Java.net窆峋,讓撰寫程式者崊取網路上的資源,舉凡像是IP定址、TCP

2012/2/10

100 年度教案年度教案年度教案年度教案主題主題主題主題::::Java 物件導向網路程式設計物件導向網路程式設計物件導向網路程式設計物件導向網路程式設計

國立善化高中國立善化高中國立善化高中國立善化高中 蕭嘉民蕭嘉民蕭嘉民蕭嘉民 老師老師老師老師

民國民國民國民國 100 年年年年 12 月月月月 10 日日日日

Java 物件導向網路程式設計(一).................................................. 1

Java 物件導向網路程式設計(二).................................................. 7

Java 物件導向網路程式設計(三)................................................. 12

Java 物件導向網路程式設計(四)................................................. 22

Page 2: 國岷善化高中 蕭嘉岙蕭嘉岙 老窯 - tn.edu.twicerc.tnssh.tn.edu.tw/download/tm/100-1-5.pdf · 過Java.net窆峋,讓撰寫程式者崊取網路上的資源,舉凡像是IP定址、TCP

1

壹壹壹壹、、、、課程說明課程說明課程說明課程說明

單元名稱單元名稱單元名稱單元名稱 Java 物件導向網路程式設計(一)

單元摘要單元摘要單元摘要單元摘要 Java.net 套件的網路功能說明。

Java 例外處理 try/catch 語法。

設計者設計者設計者設計者 國立善化高中 蕭嘉民 老師

學習目標學習目標學習目標學習目標

1.了解程式如何透過查詢 DNS 主機,解析 IP 位址與網域主機名稱。

2.認識 Java.net 網路套件 InetAddress 類別之功能。

3.認識 Java 例外處理 try/catch 語法。

課綱範圍課綱範圍課綱範圍課綱範圍 電腦與問題解決。

電腦網路。

教學節數教學節數教學節數教學節數 2 節

先備知識先備知識先備知識先備知識 1.對程式設計語言具有基礎概念。

2.熟悉資訊科技概論課程「電腦網路」、「電腦與問題解決」兩單元內容。

評量方法評量方法評量方法評量方法 課堂觀察與口頭問答

上機實作。

參考資源參考資源參考資源參考資源

參考書籍參考書籍參考書籍參考書籍 李昇暾、詹智安,Java 實務程式設計(民國 92 年) ,旗標資訊。

李昇暾、詹智安,Java 實用程式設計(民國 88 年) ,松崗資訊。

郭尚君,JAVA 2 入門進階(民國 97 年),文魁資訊。

賀元、賴明宗、劉燈,世紀末軟體革命復刻版(民國 95 年),上奇科技。

段維瀚,前進 JAVA 認證 SCJP(民國 92 年),文魁資訊。

段維瀚,JAVA 認證 SCJP 6.0/5.0 猛虎出閘(民國 97 年),碁峰資訊。

施威銘研究室,最新 Java2 程式語言第 2版(民國 97 年),旗標資訊。

Kathy Sierra & Bert Bates,深入淺出 Java 程式設計(民國 94 年),O’REILLY。

吳建廷譯,W.RICHARD STEVENS 著、Unix 網路程式設計,(民國 82 年),松崗資訊。

王柳鋐譯,Java 教學手冊第二版,(民國 87 年),碁峰資訊。

楊錦潭、Java 入門進階範例集,(民國 88 年),儒林資訊。

Java Zukowski 著,陳常侃、曾建誠譯,精通 Java 1.1 進階篇(民國 86) ,儒林資訊。

易文韜、陳穎平著,Java 製作動態 Home Page 的最新利器(民國 85) ,旗標資訊。

網站資源網站資源網站資源網站資源

http://download.oracle.com/javase/6/docs/api/overview-summary.html

http://www.java.com/zh_TW/about/

http://zh.wikipedia.org/zh-tw/Wikipedia

Page 3: 國岷善化高中 蕭嘉岙蕭嘉岙 老窯 - tn.edu.twicerc.tnssh.tn.edu.tw/download/tm/100-1-5.pdf · 過Java.net窆峋,讓撰寫程式者崊取網路上的資源,舉凡像是IP定址、TCP

2

貳貳貳貳、、、、教學活動計畫教學活動計畫教學活動計畫教學活動計畫

教學活動教學活動教學活動教學活動

時時時時

間間間間

說說說說 明明明明

IP 位址與

網 域 名 稱

說明。

DNS 伺服器

角 色 與 功

能。

2

節節節節

IP 位址是使用者在網路世界存取資源的主要依據,不過 IP 位址對多數

網路使用者來說是不具有意義的,而且又不容易記憶,因此存取網路資源,

多數人習慣上會採用「主機名稱.網域名稱」的方式。正如在瀏覽器的網址

列,輸入 http://www.google.com.tw 或 http://74.125.31.106,皆可連上

Google 網站,但鮮少有人會記得住 Google 網站的 IP 位址,若能了解網域

名稱的命名原則,相信「主機名稱.網域名稱」的方式是較容易記憶。

DNS(domain name server)網域名稱伺服器扮演著將主機網域名稱與 IP

互相轉換的角色。一般將主機網域名稱轉成 IP 位址,稱正解;而將 IP 位址

反向解析為主機網域名稱,稱為反解。

nslookup 指令可透過網域所在的 DNS 伺服器,以正解查詢方式查到 IP

或反解方式查詢主機網域名稱。筆者以服務學校 Web 主機為例進行查詢,如

下;

C:\Documents and Settings\Administrator>nslookup

Default Server: dns.shsh.tnc.edu.tw

Address: 210.60.253.1

> www.shsh.tnc.edu.tw 正解查詢

Server: dns.shsh.tnc.edu.tw

Address: 210.60.253.1

Name: www.shsh.tnc.edu.tw

Address: 210.60.253.38

> 210.60.253.38 反解查詢

Server: dns.shsh.tnc.edu.tw

Address: 210.60.253.1

Name: www.shsh.tnc.edu.tw

Address: 210.60.253.38

存取網路資源一般多數使用正解查詢,也就是以「主機名稱.網域名稱」

查詢所得之 IP 位址,流程請參考下圖:

Page 4: 國岷善化高中 蕭嘉岙蕭嘉岙 老窯 - tn.edu.twicerc.tnssh.tn.edu.tw/download/tm/100-1-5.pdf · 過Java.net窆峋,讓撰寫程式者崊取網路上的資源,舉凡像是IP定址、TCP

3

教學活動教學活動教學活動教學活動

時時時時

間間間間

說說說說 明明明明

Java.net

網 路 套 件

的 功 能 說

明。

try/catch

語 法 來 處

理 例 外 狀

況。

範 例 程 式

說明。

Java 定位於物件導向網路程式語言,具備存取網路資源的能力,可透

過 Java.net 套件,讓撰寫程式者存取網路上的資源,舉凡像是 IP 定址、TCP

網路連線、辨識網路資源、透過 UDP 傳收資料封包與網路安全等功能等,都

包含在 Java.net 套件。Java 程式開發者透過 Java.net 套件來撰寫網路程

式,相較於筆者以往使用 C語言撰寫 Socket 通訊程式,簡單多了。

Java 的 InetAddress 類別,透過呼叫 getHostAddress()方法取得 IP

位址,呼叫 getHostName()可取得電腦主機名稱,其實很像在命令提示字元

底下輸入 nslookup 命令,透過網路上 DNS 伺服器查詢到某部主機名稱或 IP

位址的功能類似。

程式撰寫人員即使 Coding 經驗再豐富,在撰寫網路程式時,要考量因

素相當多,想讓程式完全沒有任何錯誤,其實是不太可能的,Java 在處理

程式例外錯誤時,利用 try/catch 的語法來處理例外狀況,讓例外狀況出現

時,可依預先的設計規劃,產生對應的處理方式。如下為 try/catch 的語法

說明:

ttttryryryry

{{{{

可能造成例外可能造成例外可能造成例外可能造成例外狀狀狀狀況的程式碼況的程式碼況的程式碼況的程式碼,,,,括號內程式若有錯誤括號內程式若有錯誤括號內程式若有錯誤括號內程式若有錯誤,,,,將由後面的將由後面的將由後面的將由後面的

catchcatchcatchcatch 程式區塊處理程式區塊處理程式區塊處理程式區塊處理

}}}}

catch(catch(catch(catch(由程式處理的例外由程式處理的例外由程式處理的例外由程式處理的例外狀狀狀狀況一況一況一況一))))

{{{{

處理例外狀況一程式碼處理例外狀況一程式碼處理例外狀況一程式碼處理例外狀況一程式碼

}}}}

catch(catch(catch(catch(由程式處理的例外由程式處理的例外由程式處理的例外由程式處理的例外狀狀狀狀況二況二況二況二))))

{{{{

處理例外狀況二程式碼處理例外狀況二程式碼處理例外狀況二程式碼處理例外狀況二程式碼

}}}}

finallyfinallyfinallyfinally

{{{{ 結束處理程式碼結束處理程式碼結束處理程式碼結束處理程式碼((((無無無無論例外處理有無論例外處理有無論例外處理有無論例外處理有無被被被被 catchcatchcatchcatch 敍述敍述敍述敍述處理處理處理處理,,,,此區塊皆會執行此區塊皆會執行此區塊皆會執行此區塊皆會執行))))

}}}}

例外狀況如:UnknownHostException 無法找到對應的主機名稱、

IOException 檔案開啟錯誤等等。

範例程式 NetAddress.java,透過資料流的方式,讀取資料檔

domain.txt,逐行地存入緩衝區,當要讀取時,透過 BufferedReader 類別

之 readLine()方法,取得網路主機名稱,並透過 InetAddress 類別,呼叫

getHostAddress()取得 IP 位址,呼叫 getHostName()可取得電腦主機名稱。

在範例程式中為避免有例外狀況出現,導致程式中斷,故運用

try/catch 的語法來處理例外狀況。以下列出本範例程式中,出現的兩種例

Page 5: 國岷善化高中 蕭嘉岙蕭嘉岙 老窯 - tn.edu.twicerc.tnssh.tn.edu.tw/download/tm/100-1-5.pdf · 過Java.net窆峋,讓撰寫程式者崊取網路上的資源,舉凡像是IP定址、TCP

4

教學活動教學活動教學活動教學活動

時時時時

間間間間

說說說說 明明明明

例 外 狀 況

處 理 之 訊

息。

外狀況與程式處理情形。

若網路中斷將出現以下訊息。

一、例外處理,不加 finally 區塊。

c:\program1>java NetAddress

自檔案讀取到的字串自檔案讀取到的字串自檔案讀取到的字串自檔案讀取到的字串---->www.shsh.tnc.edu.tw

無法找到對應的主機名稱無法找到對應的主機名稱無法找到對應的主機名稱無法找到對應的主機名稱:

可能是原因可能是原因可能是原因可能是原因:1.網路中斷網路中斷網路中斷網路中斷、、、、2.DNS 主機設定錯誤主機設定錯誤主機設定錯誤主機設定錯誤、、、、3 輸入主機名稱錯誤輸入主機名稱錯誤輸入主機名稱錯誤輸入主機名稱錯誤

二、例外處理,加上 finally 區塊。

c:\program1>java NetAddress

自檔案讀取到的字串自檔案讀取到的字串自檔案讀取到的字串自檔案讀取到的字串---->www.shsh.tnc.edu.tw

無法找到對應的主機名稱無法找到對應的主機名稱無法找到對應的主機名稱無法找到對應的主機名稱:

可能是原因可能是原因可能是原因可能是原因:1.網路中斷網路中斷網路中斷網路中斷、、、、2.DNS 主機設定錯誤主機設定錯誤主機設定錯誤主機設定錯誤、、、、3 輸入主機名稱錯誤輸入主機名稱錯誤輸入主機名稱錯誤輸入主機名稱錯誤

Java 例外處理例外處理例外處理例外處理,,,,finally 區塊區塊區塊區塊

若檔案不存在,將出現以下訊息

一、例外處理,不加 finally 區塊

c:\program1>java NetAddress

檔案開啟錯誤檔案開啟錯誤檔案開啟錯誤檔案開啟錯誤

二、例外處理,加上 finally 區塊。

c:\program1>java NetAddress

檔案開啟錯誤檔案開啟錯誤檔案開啟錯誤檔案開啟錯誤

Java 例外處理例外處理例外處理例外處理,,,,finally 區塊區塊區塊區塊

Page 6: 國岷善化高中 蕭嘉岙蕭嘉岙 老窯 - tn.edu.twicerc.tnssh.tn.edu.tw/download/tm/100-1-5.pdf · 過Java.net窆峋,讓撰寫程式者崊取網路上的資源,舉凡像是IP定址、TCP

5

範例程式 1:NetAddress.java //範例程式 NetAddress.java,說明 Java InetAddress 類別之功能

//getHostAddress()取得 IP,getHostName()取得網域主機名稱

import java.net.*;

import java.io.*;

public class NetAddress

{

public static void main(String args[])

{

try

{

//將檔案內容讀出,並存至由 BufferedReader 類別所建立之物件(data_buffer)中

BufferedReader data_buffer = new BufferedReader(new FileReader("domain.txt"));

String DomainName_String; //存放從 data_buffer 讀出之 URL 字串

//從物件 data_buffer 逐行讀取資料,直到讀至 null 後,停止讀取

while((DomainName_String=data_buffer.readLine()) != null)

{

//輸出自緩衝區讀取到的資料

System.out.println("自檔案讀取到的字串->"+DomainName_String);

//運用 java.net 套件的 InetAddress 類別,建立此類別物件

InetAddress address= InetAddress.getByName(DomainName_String);

System.out.println("IP Address(IP 網址):"+address.getHostAddress());

System.out.println("HostName(主機名稱):"+address.getHostName());

System.out.println();

}

data_buffer.close(); //關閉緩衝區

}

// 例外處理

catch(UnknownHostException e)

{

System.err.println("無法找到對應的主機名稱:");

System.err.println("可能是原因:1.網路中斷、2.DNS 主機設定錯誤、3 輸入主機名稱錯誤");

}

catch(IOException e)

{

System.err.println("檔案開啟錯誤");

}

finally

{

System.out.println("Java 例外處理,finally 區塊");

}

}

}

資料檔 domain.txt

www.shsh.tnc.edu.tw

210.60.253.1

wwww.shsh.tnc.edu.tw

資料檔中,不存在或錯誤之 URL,是用來測試程式之例外處理。

Page 7: 國岷善化高中 蕭嘉岙蕭嘉岙 老窯 - tn.edu.twicerc.tnssh.tn.edu.tw/download/tm/100-1-5.pdf · 過Java.net窆峋,讓撰寫程式者崊取網路上的資源,舉凡像是IP定址、TCP

6

範例程式 1:NetAddress.java 執行結果

c:\program1>javac NetAddress.java

c:\program1>java NetAddress

自檔案讀取到的字串->www.shsh.tnc.edu.tw

IP Address(IP 網址):210.60.253.38

HostName(主機名稱):www.shsh.tnc.edu.tw

自檔案讀取到的字串->210.60.253.1

IP Address(IP 網址):210.60.253.1

HostName(主機名稱):dns.shsh.tnc.edu.tw

自檔案讀取到的字串->wwww.shsh.tnc.edu.tw

無法找到對應的主機名稱:

可能是原因:1.網路中斷、2.DNS 主機設定錯誤、3 輸入主機名稱錯誤

Java 例外處理,finally 區塊

c:\program1>

Page 8: 國岷善化高中 蕭嘉岙蕭嘉岙 老窯 - tn.edu.twicerc.tnssh.tn.edu.tw/download/tm/100-1-5.pdf · 過Java.net窆峋,讓撰寫程式者崊取網路上的資源,舉凡像是IP定址、TCP

7

壹壹壹壹、、、、課程說明課程說明課程說明課程說明

單元名稱單元名稱單元名稱單元名稱 Java 物件導向網路程式設計(二)

單元摘要單元摘要單元摘要單元摘要 1.透過 URL 類別的物件與方法,存取網路資源。

2.如何透過資料流存取檔案。

設計者設計者設計者設計者 國立善化高中 蕭嘉民 老師

學習目標學習目標學習目標學習目標

1.認識 URL 結構與組成方式。

2.了解 Java 語言如何使用 URL 類別存取網路資源。

3.認識如何透過資料流存取檔案。

課綱範圍課綱範圍課綱範圍課綱範圍 電腦與問題解決。

電腦網路。

教學節數教學節數教學節數教學節數 2 節

先備知識先備知識先備知識先備知識 1.對程式設計語言具有基礎概念。

2.熟悉資訊科技概論課程「電腦網路」、「電腦與問題解決」兩單元內容。

評量方法評量方法評量方法評量方法 課堂觀察與口頭問答

上機實作。

參考資源參考資源參考資源參考資源

參考書籍參考書籍參考書籍參考書籍 李昇暾、詹智安,Java 實務程式設計(民國 92 年) ,旗標資訊。

李昇暾、詹智安,Java 實用程式設計(民國 88 年) ,松崗資訊。

郭尚君,JAVA 2 入門進階(民國 97 年),文魁資訊。

賀元、賴明宗、劉燈,世紀末軟體革命復刻版(民國 95 年),上奇科技。

段維瀚,前進 JAVA 認證 SCJP(民國 92 年),文魁資訊。

段維瀚,JAVA 認證 SCJP 6.0/5.0 猛虎出閘(民國 97 年),碁峰資訊。

施威銘研究室,最新 Java2 程式語言第 2版(民國 97 年),旗標資訊。

Kathy Sierra & Bert Bates,深入淺出 Java 程式設計(民國 94 年),O’REILLY。

吳建廷譯,W.RICHARD STEVENS 著、Unix 網路程式設計,(民國 82 年),松崗資訊。

王柳鋐譯,Java 教學手冊第二版,(民國 87 年),碁峰資訊。

楊錦潭、Java 入門進階範例集,(民國 88 年),儒林資訊。

Java Zukowski 著,陳常侃、曾建誠譯,精通 Java 1.1 進階篇(民國 86) ,儒林資訊。

易文韜、陳穎平著,Java 製作動態 Home Page 的最新利器(民國 85) ,旗標資訊。

網站資源網站資源網站資源網站資源

http://download.oracle.com/javase/6/docs/api/overview-summary.html

http://www.java.com/zh_TW/about/

http://zh.wikipedia.org/zh-tw/Wikipedia

Page 9: 國岷善化高中 蕭嘉岙蕭嘉岙 老窯 - tn.edu.twicerc.tnssh.tn.edu.tw/download/tm/100-1-5.pdf · 過Java.net窆峋,讓撰寫程式者崊取網路上的資源,舉凡像是IP定址、TCP

8

貳貳貳貳、、、、教學活動計畫教學活動計畫教學活動計畫教學活動計畫

教學活動教學活動教學活動教學活動 時時時時 間間間間 說說說說 明明明明

說明資料流的意

義。

實作如何透過輸

入資料流讀取檔

案。

說明URL的意義與

用途。

1.5 節節節節

資料流是指程式間所有資料流動路徑,談到資料流動的路

徑,包括從資料的起點到資料的終點。舉例來說:將資料寫入

檔案,檔案是資料的終點,而資料的起點自然是程式本身。具

體說來,資料流是資料從某個地方流到某個地方,資料流動的

路徑就可稱為資料流。資料流就讀寫方式與性質分為兩類:

一、依資料輸出、入區分:來源讀取 InputStream 或 Reader、

與目標寫入 OutputStream 或 Writer 兩類。

二、依資料內容的組成區分:位元組資料流 InputStream、

OutputStream,字元組資料流 Writer、Reader。

對於輸出入為中文字時,需將位元組資料轉成字元資料

流,才能正確的顯示與儲存,範例程式 URLresolve.java 中檔

案讀取的方式,如下圖所示:

步驟一:

程式中透過字元

資 料 流 類 別

FileReader 讀取檔

案的資料。

步驟二:

建立 BufferedReader

類別之物件,將從檔

案讀出的資料,先存

至緩衝區。

步驟三:

讀取資料時,透過

BufferedReader 類別

的 readline()方法.逐

行讀取資料,並儲存

到字串變數,一直讀

到 Null 為止。

URL 是統一資源定位器(UniForm Resource Locator)的簡稱,

其格式為:

通訊協定通訊協定通訊協定通訊協定://主機名稱主機名稱主機名稱主機名稱.網域名稱網域名稱網域名稱網域名稱/路徑名稱路徑名稱路徑名稱路徑名稱/檔案名稱檔案名稱檔案名稱檔案名稱

透過 URL 的資源存取方式,可存取網路資源。使用者在瀏

覽器上輸入 URL,就能在 Internet 上取得所要網路資源,Java 亦

可使用 URL 類別,建立其物件,來存取網路資源,Java 使用 URL

類別建立物件後,可查詢與取得網路資源的通訊協定、主機名

稱、檔案名稱、通訊埠號等等。

類別方法 用途說明

getProtocol()

取得通訊協定

getHost() 取得主機名稱

getFile() 取得檔案名稱

getPort() 取得通訊埠號

Page 10: 國岷善化高中 蕭嘉岙蕭嘉岙 老窯 - tn.edu.twicerc.tnssh.tn.edu.tw/download/tm/100-1-5.pdf · 過Java.net窆峋,讓撰寫程式者崊取網路上的資源,舉凡像是IP定址、TCP

9

教學活動教學活動教學活動教學活動 時時時時 間間間間 說說說說 明明明明

說明 URL 類別與

openConnection()

方法之功能。

URL 類別透過 openConnection()建立與 URL 連結後,可查

詢與取得網路資源如檔案大小、型態、檔案修改日期等等資料。

類別方法 用途說明

getContentLength() 取得檔案大小

getContentType() 取得檔案型態

getLastModified() 取得檔案修改日期

範例程式說明。

0.5 節節節節

URLresolve.java 範例程式,透過資料流的方式,讀取資料

檔 url.txt,取得文件中的字串,再逐行存入緩衝區,當要使用

時,透過迴圈控制讀出 URL 字串,再呼叫 URL 物件與

openConnection()方法,來取得網路資源的通訊協定、主機名

稱、通訊埠號、檔案名稱、檔案大小、檔案型態、檔案修改日

期等等資料。

在程式中為避免有例外狀況出現中斷程式,可透過

try/catch 的語法,來處理這些例外狀況。

Page 11: 國岷善化高中 蕭嘉岙蕭嘉岙 老窯 - tn.edu.twicerc.tnssh.tn.edu.tw/download/tm/100-1-5.pdf · 過Java.net窆峋,讓撰寫程式者崊取網路上的資源,舉凡像是IP定址、TCP

10

範例程式 2: URLresolve.java // 範例程式 URLresolve.java,功能說明:

// 1.建立 URL 類別之物件

// 2.openConnection 存取網路資源之功能

import java.net.*;

import java.io.*;

import java.lang.*;

import java.util.*;

public class URLresolve

{

public static void main(String args[])

{

try{

//將檔案內容讀出,並存至 BufferedReader 類別型態的 data_buffer 物件中

BufferedReader data_buffer = new BufferedReader(new FileReader("url.txt"));

String URL_string; //存放從 data_buffer 讀出之 URL 字串

//從物件 data_buffer 逐行讀取資料,直到讀至 null 後,停止讀取

while((URL_string=data_buffer.readLine()) != null)

{

System.out.println("檔案讀取字串->"+URL_string); //輸出讀取到的資料

//建立 URL 類別之物件

URL HostURL =new URL(URL_string);

//取得 URL 物件之通訊協定、主機名稱、檔案名稱、通訊埠號

System.out.print("URL Protocol:"+HostURL.getProtocol());

System.out.print(", Host:"+HostURL.getHost());

System.out.print(", FileName:"+HostURL.getFile());

System.out.println(", Port:"+HostURL.getPort());

//使用 openConnection 建立 URL 連線,傳回 URLConnection 物件

//表示連接到 URL 所參考的物件。

URLConnection conline = HostURL.openConnection();

//連線資訊如檔案大小、型態、檔案修改日期

System.out.print("File Size:"+conline.getContentLength());

System.out.print(", File Type:"+conline.getContentType());

//傳入 Date 物件之參數,表示自 1970 年 1 月 1 日 00:00:00 GMT 至檔案修改時間所經過的毫秒數

Date filedate = new Date(conline.getLastModified());

System.out.println(", Modified Date:"+filedate.toString());

System.out.println();

}

data_buffer.close(); //關閉緩衝區

}

catch(MalformedURLException e) //建構 URL 物件時,使用不正確的通訊協定

{

System.err.println("未知的通訊協定或 URL 字串錯誤");

}

catch(IOException e)

{

System.err.println("檔案開啟錯誤");

}

}

}

資料檔 url.txt http://teacher.shsh.tnc.edu.tw:80/~jiamin/aboutme.htm

http://210.60.253.16:80/~course/index.htm

htxtp://210.60.253.13

Page 12: 國岷善化高中 蕭嘉岙蕭嘉岙 老窯 - tn.edu.twicerc.tnssh.tn.edu.tw/download/tm/100-1-5.pdf · 過Java.net窆峋,讓撰寫程式者崊取網路上的資源,舉凡像是IP定址、TCP

11

範例程式 2: URLresolve.java 執行結果

c:\program1>javac URLresolve.java

c:\program1>java URLresolve

檔案讀取字串->http://teacher.shsh.tnc.edu.tw:80/~jiamin/aboutme.htm

URL Protocol:http, Host:teacher.shsh.tnc.edu.tw, FileName:/~jiamin/aboutme.htm,

Port:80

File Size:5459, File Type:text/html; charset=Big5, Modified Date:Tue Apr 22 12:0

3:22 CST 2008

檔案讀取字串->http://210.60.253.16:80/~course/index.htm

URL Protocol:http, Host:210.60.253.16, FileName:/~course/index.htm, Port:80

File Size:422, File Type:text/html; charset=UTF-8, Modified Date:Wed Jun 22 22:1

1:13 CST 2011

檔案讀取字串->htxtp://210.60.253.13

未知的通訊協定或 URL 字串錯誤

c:\program1>

Page 13: 國岷善化高中 蕭嘉岙蕭嘉岙 老窯 - tn.edu.twicerc.tnssh.tn.edu.tw/download/tm/100-1-5.pdf · 過Java.net窆峋,讓撰寫程式者崊取網路上的資源,舉凡像是IP定址、TCP

12

單元名稱單元名稱單元名稱單元名稱 Java 物件導向網路程式設計(三)

單元摘要單元摘要單元摘要單元摘要

1.網路資源分享方式介紹。

2.TCP 通訊協定中,Socket 連線與通訊埠觀念之介紹。

3.Java Client-Server 程式架構介紹(單一執行緒)。

4.Client-Server 網路架構與資料流傳送方式說明。

設計者設計者設計者設計者 國立善化高中 蕭嘉民 老師

學習目標學習目標學習目標學習目標

1.學習 Java Client-Server 網路架構程式撰寫。

2.了解 Socket 連線與通訊埠運作方式。

3.了解網路 TCP 資料流之傳輸與存取方式。

課綱範圍課綱範圍課綱範圍課綱範圍 電腦與問題解決。

電腦網路。

教學節數教學節數教學節數教學節數 4 節

先備知識先備知識先備知識先備知識 1.對程式設計語言具有基礎概念。

2.熟悉資訊科技概論課程「電腦網路」、「電腦與問題解決」兩單元內容。

評量方法評量方法評量方法評量方法 課堂觀察與口頭問答

上機實作。

參考資源參考資源參考資源參考資源

參考書籍參考書籍參考書籍參考書籍 李昇暾、詹智安,Java 實務程式設計(民國 92 年) ,旗標資訊。

李昇暾、詹智安,Java 實用程式設計(民國 88 年) ,松崗資訊。

郭尚君,JAVA 2 入門進階(民國 97 年),文魁資訊。

賀元、賴明宗、劉燈,世紀末軟體革命復刻版(民國 95 年),上奇科技。

段維瀚,前進 JAVA 認證 SCJP(民國 92 年),文魁資訊。

段維瀚,JAVA 認證 SCJP 6.0/5.0 猛虎出閘(民國 97 年),碁峰資訊。

施威銘研究室,最新 Java2 程式語言第 2版(民國 97 年),旗標資訊。

Kathy Sierra & Bert Bates,深入淺出 Java 程式設計(民國 94 年),O’REILLY。

吳建廷譯,W.RICHARD STEVENS 著、Unix 網路程式設計,(民國 82 年),松崗資訊。

王柳鋐譯,Java 教學手冊第二版,(民國 87 年),碁峰資訊。

楊錦潭、Java 入門進階範例集,(民國 88 年),儒林資訊。

Java Zukowski 著,陳常侃、曾建誠譯,精通 Java 1.1 進階篇(民國 86) ,儒林資訊。

易文韜、陳穎平著,Java 製作動態 Home Page 的最新利器(民國 85) ,旗標資訊。

網站資源網站資源網站資源網站資源

http://download.oracle.com/javase/6/docs/api/overview-summary.html

http://www.java.com/zh_TW/about/

http://zh.wikipedia.org/zh-tw/Wikipedia

Page 14: 國岷善化高中 蕭嘉岙蕭嘉岙 老窯 - tn.edu.twicerc.tnssh.tn.edu.tw/download/tm/100-1-5.pdf · 過Java.net窆峋,讓撰寫程式者崊取網路上的資源,舉凡像是IP定址、TCP

13

貳貳貳貳、、、、教學活動計畫教學活動計畫教學活動計畫教學活動計畫

教學活動教學活動教學活動教學活動 時時時時 間間間間 說說說說 明明明明

常見網路資源的

分享方式。

說明通訊埠號的

功能。

1 節節節節

P2P 與 Client-Server 是目前網際網路上,電腦通訊的兩種

主要架構,P2P 主要用於個人電腦間,彼此互相分享檔案的機

制,P2P 架構下,電腦一般同時具有兩種角色,沒有清楚的 Client

或 Server 角色的界定,安全性與資料一致性,難以控管,網路

伺服器一般很少採用此種架構。

Client-Server 是目前網路資源提供的主流架構,通常某一

種網路服務都有專門主機負責提供,網路上常見的 mail 主機、

web 網頁服務、dns 網域名稱服務、ftp 主機,主要是都是採用

Client-Server 架構。

在 Internet 網際網路中 Client-Server 架構下,電腦可互

相通訊定義包含五個基本要素(W.Richard Stevens, 1993):

一、通訊協定的種類(UDP 或 TCP)。

二、Client 端主機的 IP 位址。

三、Client 端主機的通訊埠號(port number)。

四、Server 端主機的 IP 位址。

五、Server 端主機的通訊埠號(port number)。

TCP 通訊埠號,從 0-1023 是保留給特定的 service 使用,

下表中為常見的通訊埠號,使用者撰寫程式時,不要用 0-1023

間的通訊埠號,特別是已有特定用途的埠號:

網路服務名稱 通訊埠號

網頁伺服器 http 80

telnet 遠端登入 23

ssh 遠端登入 22

ftp 檔案傳輸 21

簡單郵件交換協定 SMTP 25

POP3(Post Office Protocol) 110

IMAP(Internet Message Access Protocol) 143

常見之網路服務名稱與通訊埠號

電腦與電腦或與網路設備間,透實體線路連接,電腦如何分

辨資料的用途呢?其實是透過資料傳輸時,所指定的通訊埠號。

通訊埠號用途,就好比郵局窗口,提供不同的服務,如外匯、

基金、儲匯、公債、包裹/快遞、壽險、房貸與集郵...,民

眾到不同窗口,取得不同的服務或滿足需求,電腦便是透過不同

通訊埠號,賦於不同服務來達成。

Page 15: 國岷善化高中 蕭嘉岙蕭嘉岙 老窯 - tn.edu.twicerc.tnssh.tn.edu.tw/download/tm/100-1-5.pdf · 過Java.net窆峋,讓撰寫程式者崊取網路上的資源,舉凡像是IP定址、TCP

14

教學活動教學活動教學活動教學活動 時時時時 間間間間 說說說說 明明明明

Server 與 Client

雙方 Socket 連線

的建立。

0.5 節節節節

依上述要件, Client-Server 架構,電腦主機間採用 TCP

通訊協定,運用 Socket 建立通訊方式,闡述如下:

一、Client-Server 兩台電腦連線間,建立 Socket 後,雙

方電腦就會存有彼此的網路位址與 TCP 通訊埠號,雙方建立

Socket 方式如下:

Server 端建立 Socket 時,需指定通訊埠號,並以本身主機

之IP為 Server IP,等待Client傳送資料。Server端建立Socket

指令如下:

ServerSocket Sev_Socket = new ServerSocket(10000);ServerSocket Sev_Socket = new ServerSocket(10000);ServerSocket Sev_Socket = new ServerSocket(10000);ServerSocket Sev_Socket = new ServerSocket(10000);

Client 若要與 Server 建立連線,Client 亦要建立 Socket。

設定 Socket 時,要指定與 Server 端相同通訊埠號、Server 主

機之 IP 給 Client 的 Socket,傳送給 Server 後,才能完成連線

動作。Client 端建立 Socket 指令如下:

Socket socket = new Socket(hoSocket socket = new Socket(hoSocket socket = new Socket(hoSocket socket = new Socket(hoststststIPIPIPIP,10000);,10000);,10000);,10000);

二、Client 對 Server 的 IP 位址與通訊埠號建立連結後,

Client 用戶端送出訊息給 Server,Server 自串流中讀取訊息。

三、Server 回應用戶端之訊息,Client 自串流中讀取訊息。

在 TCP/IP 通訊協定下,Socket 是兩個程式間溝通的管道。

Server 端執行的程式,通常會監聽某一個通訊埠(Port),等待

Client 的連線。在連接導向的連線中,應用程式透過連線兩方

Socket 的建立,將本身電腦的 IP 與埠號與另一部電腦的 IP 與

埠號連結,達成溝通的目的。

Page 16: 國岷善化高中 蕭嘉岙蕭嘉岙 老窯 - tn.edu.twicerc.tnssh.tn.edu.tw/download/tm/100-1-5.pdf · 過Java.net窆峋,讓撰寫程式者崊取網路上的資源,舉凡像是IP定址、TCP

15

教學活動教學活動教學活動教學活動 時時時時 間間間間 說說說說 明明明明

範例程式架構說

明。

Serevr 與 Client

資料傳送方式。

1.5 節節節節

1 節節節節

Server 端建立 SeverSocket 物件,執行 Accept()方法後,

就會等待 Client 端的連線請求,達成連線狀態。

Client 端在建立 Socket 物件時,必須先提供 Server 端的

連線位址與通訊埠給本身的 Socket,再對 Server 端發出連線的

請求。在 Server 與 Client 雙方連線完成後,透過迴圈確保資料

發送與接收,持續進行。

範例程式 Client/ Server 連接導向 Socket 系統架構圖

依資料傳送方向與讀寫方式,概略將資料流分類如下:

一一一一、、、、CCCClientlientlientlient 讀取讀取讀取讀取來自來自來自來自 ServServServServeeeerrrr 端的端的端的端的資料流資料流資料流資料流:Client 端透過連

線建立的 Socket,取得輸入位元組資料流 InputStream,再藉由

InputStreamReader 物件,將位元組資料流轉成字元組資料流,

最後將資料暫存在緩衝區物件,等待需要再讀出。使用

BufferedReader 自 Socket 讀取資料語法如下:

new BufferedReader(new InputStreamReader(Socket.getInputStream()))

步驟一步驟一步驟一步驟一::::

Client-Server

建立 Socket 連

線後。

步驟步驟步驟步驟二二二二::::

Client 使用 Socket 的

getInputStream() 取

得 Server 端的位元組

資料流 OutputStream。

步驟步驟步驟步驟三三三三::::

將位元組資料

流轉成字元組

資料流。

步驟步驟步驟步驟四四四四::::

建立緩衝區字

元組物件,讀取

字 元 組 資 料

流。

步驟步驟步驟步驟五五五五::::

Client 至緩

衝區讀取資

料。

二、ServServServServeeeerrrr 讀取讀取讀取讀取來自來自來自來自 CCCClientlientlientlient 端的端的端的端的資料流資料流資料流資料流:方法雷同,如下

列圖示,不再贅述,請參閱程式碼。

Page 17: 國岷善化高中 蕭嘉岙蕭嘉岙 老窯 - tn.edu.twicerc.tnssh.tn.edu.tw/download/tm/100-1-5.pdf · 過Java.net窆峋,讓撰寫程式者崊取網路上的資源,舉凡像是IP定址、TCP

16

教學活動教學活動教學活動教學活動 時時時時 間間間間 說說說說 明明明明

三三三三、、、、ClientClientClientClient 寫入寫入寫入寫入至至至至 ServerServerServerServer 端端端端的的的的資料流資料流資料流資料流:透過連線建立的

Socket,將資料以字元組資料流方式寫入 PrintWriter(或是先

寫入 BufferedWriter、再傳入 OutputStreamWriter 亦可),之

後藉由 OutputStream 物件,將字元組資料流轉成位元組資料

流,最終,Server 端便可從 Client 的 OutputStream 讀取 Client

傳送過來的資料。本範例中 Client 端寫入資料流分為兩種方式:

(一)Client端從 PrintWriter、OutputStream寫資料到Server

端,語法如下: new PrintWriter(socket.getOutputStream());

(二) Client 從 BufferedWriter、傳入 OutputStreamWriter、

OutputStream,再寫資料到 Server 端,語法如下: new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

步驟一步驟一步驟一步驟一::::

Client-Server

建立 Socket 連

線後。

步驟步驟步驟步驟二二二二::::

PrintWriter 是

Client 端的輸出字元

組資料流,Client 端將

要傳輸的資料寫入此

物件。

或或或或 BufferedWriter 、

OutputStreamWriter

是 Client 端的輸出字

元組資料流。Client 端

將要傳輸的資料寫入

此兩個物件。

步驟步驟步驟步驟三三三三::::

將資料傳入 Socket 的

OutPutStream。並把字元

組資料流轉換為位元組資

料串流。

步驟步驟步驟步驟四四四四::::

Server 端 將

Client 端送出

OutputStream

轉 換 為

InputStream

讀取資料。

範例程式 3-2 Client 端程式,除了使用 PrintWriter、

OutputStream 寫資料到 Socket,亦可使用 BufferedWriter、

OutputStreamWriter、OutputStream 等資料流物件結合,將資

料由 Client 端寫入 Server 端,請讀者自行依照範例程式 3-2

說明做測試。

四、ServerServerServerServer 寫入寫入寫入寫入至至至至 ClientClientClientClient 端端端端的資料流的資料流的資料流的資料流::::方法雷同,如下列

圖示,不再贅述,請參閱程式碼。

Page 18: 國岷善化高中 蕭嘉岙蕭嘉岙 老窯 - tn.edu.twicerc.tnssh.tn.edu.tw/download/tm/100-1-5.pdf · 過Java.net窆峋,讓撰寫程式者崊取網路上的資源,舉凡像是IP定址、TCP

17

教學活動教學活動教學活動教學活動 時時時時 間間間間 說說說說 明明明明

在資料流傳送的過程,把讀出來或要寫入的資料,放在緩衝

區,等緩衝區滿了或緩衝區的資料被強迫送出,再將資料真正送

到目標去,可提高程式的執行效率。

Page 19: 國岷善化高中 蕭嘉岙蕭嘉岙 老窯 - tn.edu.twicerc.tnssh.tn.edu.tw/download/tm/100-1-5.pdf · 過Java.net窆峋,讓撰寫程式者崊取網路上的資源,舉凡像是IP定址、TCP

18

範例程式 3-1:Server.java // 範例程式 Server.java,示範 Server 端之功能

import java.net.*;

import java.io.*;

import java.lang.*;

import java.util.*;

public class Server

{

public static void main(String args[])

{

if(args.length != 1)

{

System.err.println("使用語法 : Java Server 伺服器名稱");

System.exit(1); //離開程式

}

System.out.println("Java Server 伺服器名稱"+args[0]);

try

{

//建立 ServerSocket 類別之物件, 並設定通訊埠

ServerSocket Sev_Socket = new ServerSocket(10000);

while(true)

{

System.out.println(args[0]+" Server 等待中.........\n");

//Server 等候 Client 連線

Socket socket_obj = Sev_Socket.accept();

//等待讀取來自 Client 端的資料流

BufferedReader Reader = new BufferedReader(new InputStreamReader(socket_obj.getInputStream()));

String message = Reader.readLine();

//取得系統時間

Date transfer_date = new Date();

//Server 端顯示收到 Client 的訊息與內容

System.out.println(transfer_date.toString()+"收到 client 的訊息:"+message);

//將資料寫至輸出字元串流(Server 回應 Client 端收到之訊息)

//方法一

PrintWriter Writer = new PrintWriter(socket_obj.getOutputStream());

Writer.println(transfer_date.toString()+"收到訊息:"+message);

//方法二

//BufferedWriter Writer = new BufferedWriter(new OutputStreamWriter(socket_obj.getOutputStream()));

//Writer.write(transfer_date.toString()+"收到訊息:"+message+"\n");

Writer.flush(); // 將緩衝區資料全部輸出

socket_obj.close();

}

}

catch(BindException e)

{

System.err.println("重覆執行或網址已被佔用,結束程式");

}

catch(IOException e)

{

Page 20: 國岷善化高中 蕭嘉岙蕭嘉岙 老窯 - tn.edu.twicerc.tnssh.tn.edu.tw/download/tm/100-1-5.pdf · 過Java.net窆峋,讓撰寫程式者崊取網路上的資源,舉凡像是IP定址、TCP

19

System.err.println(e);

}

}

}

Page 21: 國岷善化高中 蕭嘉岙蕭嘉岙 老窯 - tn.edu.twicerc.tnssh.tn.edu.tw/download/tm/100-1-5.pdf · 過Java.net窆峋,讓撰寫程式者崊取網路上的資源,舉凡像是IP定址、TCP

20

範例程式 3-2:Client.java

//範例程式 Client.java,示範 Client 端之功能

import java.net.*;

import java.io.*;

public class Client

{

// 若未指定 Server IP,則預設 Client 與 Server 是在同一部主機運作

static String host="127.0.0.1";

public static void main(String args[])

{

if(args.length == 2)

{

System.out.println("使用者名稱:"+args[0]);

System.out.println("伺服器 IP 位址:"+args[1]);

host=args[1];

}

else

{

if(args.length == 1)

{

System.out.println("使用者名稱:"+args[0]);

}

else

{

//指定 client 端,命令與參數的格式

System.err.println("使用語法 1 : Java client 使用者名稱 伺服器 IP 位址 ");

System.err.println("使用語法 2 : Java client 使用者名稱 ");

System.exit(1); //程式結束

}

}

System.out.println("請在提示符號後輸入要傳送的字串!");

try

{

while(true)

{

//建立與 server 連線

Socket socket = new Socket(host,10000);

// Client 端使用者讀入鍵盤輸入,並將其轉換為緩衝區字元輸入資料流

BufferedReader keyin =new BufferedReader(new InputStreamReader(System.in));

//寫入 Server 端的輸出字元資料流

//注意使用者可實作兩種不同的輸出字元資料流 BufferedWriter 與 PrintWriter

//方法一

BufferedWriter OutPut_data = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

//方法二

//PrintWriter OutPut_data = new PrintWriter(socket.getOutputStream());

//讀取來自 Server 端的輸入字元資料流

BufferedReader Input_data = new BufferedReader(new InputStreamReader(socket.getInputStream()));

System.out.print("<"+args[0]+" #>");

String data=keyin.readLine();

//對使用者輸入的字串寫輸出送資料流, 送到 Server 端

Page 22: 國岷善化高中 蕭嘉岙蕭嘉岙 老窯 - tn.edu.twicerc.tnssh.tn.edu.tw/download/tm/100-1-5.pdf · 過Java.net窆峋,讓撰寫程式者崊取網路上的資源,舉凡像是IP定址、TCP

21

範例程式 3-2:Client.java

OutPut_data.write(args[0]+":"+data+"\n"); // BufferedWriter 使用

//OutPut_data.println("使用者 "+args[0]+" 說:"+data); // PrintWriter 使用

OutPut_data.flush(); //將緩衝區資料全送出

System.out.println("Client 資料已傳送了" );

//等候 server 端回覆訊息

String msg = Input_data.readLine();

System.out.println("Server 回應:" + msg+"\n");

//關閉 Socket 連線

socket.close();

}

}

catch(IOException e)

{

System.err.println(e);

}

}

}

範例程式 3:Server.java、Client.java 執行結果

Server 端程式 192.168.2.2

c:\program1>javac Server.java

c:\program1>java Server Single

Java Server 伺服器名稱 Single

Single Server 等待中.........

Sat Dec 10 01:21:17 CST 2011 收到 client 的訊息:client1:請大家多多使用自由軟體!

Single Server 等待中.........

Sat Dec 10 01:21:46 CST 2011 收到 client 的訊息:client1:EZGO9 很好用

Single Server 等待中.........

Client 端程式 192.168.2.10 h:\program1>javac Client.java

h:\program1>java Client client1 192.168.2.2

使用者名稱:client1

伺服器 IP 位址:192.168.2.2

請在提示符號後輸入要傳送的字串!

<client1 #>請大家多多使用自由軟體!

Client 資料已傳送了

Server 回應:Sat Dec 10 01:21:17 CST 2011 收到訊息:client1:請大家多多使用自由軟體!

<client1 #>EZGO9 很好用

Client 資料已傳送了

Server 回應:Sat Dec 10 01:21:46 CST 2011 收到訊息:client1:EZGO9 很好用

<client1 #>

Page 23: 國岷善化高中 蕭嘉岙蕭嘉岙 老窯 - tn.edu.twicerc.tnssh.tn.edu.tw/download/tm/100-1-5.pdf · 過Java.net窆峋,讓撰寫程式者崊取網路上的資源,舉凡像是IP定址、TCP

22

單元名稱單元名稱單元名稱單元名稱 Java 物件導向網路程式設計(四)

單元摘要單元摘要單元摘要單元摘要 Java 多重執行緒伺服器實作。

設計者設計者設計者設計者 國立善化高中 蕭嘉民 老師

學習目標學習目標學習目標學習目標

1.學習 Java 語言多重執行緒的功能與用法。

2.了解多重執行緒對改進伺服器效能的影響。

3.實作多重執行緒 Client-Server 網路架構程式。

課綱範圍課綱範圍課綱範圍課綱範圍 電腦與問題解決。

電腦網路。

教學節數教學節數教學節數教學節數 4 節

先備知識先備知識先備知識先備知識

1.對程式設計語言具有基礎概念。

2.熟悉資訊科技概論課程「電腦網路」、「電腦與問題解決」兩單元內容。

3.了解 Java 輸出入位元組與字元組資料流的運作方式。

評量方法評量方法評量方法評量方法 課堂觀察與口頭問答

上機實作。

參考資源參考資源參考資源參考資源

參考書籍參考書籍參考書籍參考書籍 李昇暾、詹智安,Java 實務程式設計(民國 92 年) ,旗標資訊。

李昇暾、詹智安,Java 實用程式設計(民國 88 年) ,松崗資訊。

郭尚君,JAVA 2 入門進階(民國 97 年),文魁資訊。

賀元、賴明宗、劉燈,世紀末軟體革命復刻版(民國 95 年),上奇科技。

段維瀚,前進 JAVA 認證 SCJP(民國 92 年),文魁資訊。

段維瀚,JAVA 認證 SCJP 6.0/5.0 猛虎出閘(民國 97 年),碁峰資訊。

施威銘研究室,最新 Java2 程式語言第 2版(民國 97 年),旗標資訊。

Kathy Sierra & Bert Bates,深入淺出 Java 程式設計(民國 94 年),O’REILLY。

吳建廷譯,W.RICHARD STEVENS 著、Unix 網路程式設計,(民國 82 年),松崗資訊。

王柳鋐譯,Java 教學手冊第二版,(民國 87 年),碁峰資訊。

楊錦潭、Java 入門進階範例集,(民國 88 年),儒林資訊。

Java Zukowski 著,陳常侃、曾建誠譯,精通 Java 1.1 進階篇(民國 86) ,儒林資訊。

易文韜、陳穎平著,Java 製作動態 Home Page 的最新利器(民國 85) ,旗標資訊。

網站資源網站資源網站資源網站資源

http://download.oracle.com/javase/6/docs/api/overview-summary.html

http://www.java.com/zh_TW/about/

http://zh.wikipedia.org/zh-tw/Wikipedia

Page 24: 國岷善化高中 蕭嘉岙蕭嘉岙 老窯 - tn.edu.twicerc.tnssh.tn.edu.tw/download/tm/100-1-5.pdf · 過Java.net窆峋,讓撰寫程式者崊取網路上的資源,舉凡像是IP定址、TCP

23

貳貳貳貳、、、、教學活動計畫教學活動計畫教學活動計畫教學活動計畫

教學活動教學活動教學活動教學活動 時時時時 間間間間 說說說說 明明明明

認識多重執行緒

對改進伺服器效

能的影響。

說明多重執行緒

的功能。

2 節節節節

範例程式 3-1 與 3-2 之在架構上,雖採 Client-Server,但

是僅能執行單一 Client 對 Server 存取的服務,Server 無法對

多個 Clients 同時提供服務,這似乎與我們所認知的伺服器,

可以同時服務多個使用者的觀念,背道而馳。本單元將利用 java

多重執行緒的特性,來解決此問題。

本單元具多重執行緒的伺服端程式架構

Java 多重執行緒是實現多工的機制,若把這個機制比擬做

組裝與生產電腦的工廠,在生產與組裝電腦時,通常會將中央

處理器、硬碟機、光碟機、主機板、記憶體等等,分別請不同

的廠商或廠房同時組裝與生產,不必依序逐一生產後,再去進

行下一個元件的生產,這樣的方式才能有效率地生產。Java 透

過多重執行緒,便可同時處理不同 Client 的個別要求,而不需

等待前一個 Client 執行完畢。

Server 端程式應能針對多個的使用者同時提供服務,若

Server 端無法同時服務多個 Client 端,將會使 Client 端無法

獲得即時的服務,同時也無法發揮 Server 應有的效能。

Java 語言透過以下兩種方式,實現多重執行緒:一是繼承

Thread 類別、另一是透過實作 Runnable 介面的 run()方法來達

成。

一、繼承 Thread 類別:在定義繼承 Thread 類別的子類別

時,只需重新撰寫子類別 run()方法的程式碼,也就是覆蓋O

verriding 繼承自父類別的內容,再由實作 Thread 類別之物件,

執行 start()方法即可,而執行 start()時,會去執行該物件

run()方法之內容,啟動多重執行緒功能,參閱範例 4-1。

二、定義 Runnable 介面,首先實作一個 Runnable 介面的

類別,在 run()方法中定義執行緒的具體內容。其次,因實作

Runnable 介面的類別,本身沒有 start 成員方法可用,因此需

透過繼承 Thread 類別建立的物件,並把實作 Runnable 介面的

物件,當做參數傳入此 Thread 類別的建構函數中,再透過實作

Page 25: 國岷善化高中 蕭嘉岙蕭嘉岙 老窯 - tn.edu.twicerc.tnssh.tn.edu.tw/download/tm/100-1-5.pdf · 過Java.net窆峋,讓撰寫程式者崊取網路上的資源,舉凡像是IP定址、TCP

24

教學活動教學活動教學活動教學活動 時時時時 間間間間 說說說說 明明明明

Java實作多重執

行緒的兩種方

法。

2 節節節節

Thread 類別之物件,執行 start()方法,如範例程式 4-2

JavaSocket 物件,以下為實作之步驟,詳細作法參考範例程式

4-2。

步驟步驟步驟步驟 1111::::實作實作實作實作 RunnableRunnableRunnableRunnable 介介介介面之類別內容面之類別內容面之類別內容面之類別內容,,,,定義定義定義定義 run()run()run()run()方法方法方法方法::::

class Server_RunClass implements Runnable

{

public void run()

{

要執行的程式內容

}

}

步驟步驟步驟步驟 2222::::啟動執行啟動執行啟動執行啟動執行多重執行緒多重執行緒多重執行緒多重執行緒程式程式程式程式::::

2.1 在主程式區塊 Main(),建立實作 Runnable 的物件,並將此物

件當做參數,傳給 Thread 類別的建構函數。

Thread Server_Thread= new Thread(new Server_RunClass(JavaSocket));

2.2 透過 Thread 類別之物件,執行 start(),會讓多重執行緒開始

執行。

Server_Thread.start();

Server 端執行多重執行緒的方式

透過 Thread 類別或 Runable 介面的運用,如上圖所示,Java

可以讓多個 Client 同時與 Server 連線,達成資源的有效利用。

Page 26: 國岷善化高中 蕭嘉岙蕭嘉岙 老窯 - tn.edu.twicerc.tnssh.tn.edu.tw/download/tm/100-1-5.pdf · 過Java.net窆峋,讓撰寫程式者崊取網路上的資源,舉凡像是IP定址、TCP

25

範例程式 4-1:MServer.java

// 範例程式 MServer.java,示範 Server 端繼承 Thread 達到多重執行緒之功能

import java.net.*;

import java.io.*;

import java.lang.*;

import java.util.*;

//定義繼承 Thread 類別的子類別

class Server_Thread extends Thread

{

//建立資料流與網路類別物件

InputStreamReader Origin_input;

BufferedReader Buffer_input;

PrintWriter Output_data;

InetAddress Javaclient;

//建構函數

public Server_Thread(Socket Server_Socket)

{

try

{

Origin_input = new InputStreamReader(Server_Socket.getInputStream());

Buffer_input = new BufferedReader(Origin_input);

Output_data = new PrintWriter(Server_Socket.getOutputStream());

Javaclient = Server_Socket.getInetAddress();

}

catch(IOException e)

{

System.err.println(e);

}

}

public void run()

{

try

{

//等待 client 端傳入資料

String msg_fromClient = Buffer_input.readLine();

//取得系統時間

Date transfer_date = new Date();

System.out.println(transfer_date.toString()+" 接收訊息 "+msg_fromClient);

//列出 Client 端的來源 IP

System.out.println("Client IP:" + Javaclient.getHostAddress());

//Server 將收到的訊息回應至 Client 端

Output_data.println(transfer_date.toString()+" 收到 "+msg_fromClient+"\n");

Output_data.flush();

System.out.println("\nServer 端等待中.........");

}

catch(IOException e)

{

System.err.println(e);

}

}

}

Page 27: 國岷善化高中 蕭嘉岙蕭嘉岙 老窯 - tn.edu.twicerc.tnssh.tn.edu.tw/download/tm/100-1-5.pdf · 過Java.net窆峋,讓撰寫程式者崊取網路上的資源,舉凡像是IP定址、TCP

26

範例程式 4-1:MServer.java

public class MServer

{

public static void main(String args[])

{

if(args.length != 1)

{

System.err.println("使用語法 : Java MServer 伺服器名稱");

System.exit(1); //結束程式

}

System.out.println("Java MServer 伺服器名稱"+args[0]);

System.out.println("Server 繼承 Thread 類別多重執行緒程式已在啟動狀態.........");

try

{

//建立 ServerSocket 類別之物件, 並且設定通訊埠

ServerSocket Socket_Obj = new ServerSocket(10000);

while(true)

{

//等待 Client(s)連線進入

Socket JavaSocket = Socket_Obj.accept();

//建立繼承自 Thread 類別的物件

Server_Thread Multithread_Server=new Server_Thread(JavaSocket);

//啟動繼承自 Thread 類別的物件

Multithread_Server.start();

}

}

catch(IOException e)

{

System.err.println(e);

}

}

}

Page 28: 國岷善化高中 蕭嘉岙蕭嘉岙 老窯 - tn.edu.twicerc.tnssh.tn.edu.tw/download/tm/100-1-5.pdf · 過Java.net窆峋,讓撰寫程式者崊取網路上的資源,舉凡像是IP定址、TCP

27

範例程式 4-1:MServer.java、Client.java 執行結果

Server 端程式(192.168.2.2) c:\program1>java MServer Thread_MServer

Java MServer 伺服器名稱 Thread_MServer

Server 繼承 Thread 類別多重執行緒程式已在啟動狀態.........

Mon Dec 05 19:58:54 CST 2011 接收訊息 client1:運動身體好

Client IP:192.168.2.10

Server 端等待中.........

Mon Dec 05 19:59:27 CST 2011 接收訊息 client2:最愛學電腦

Client IP:192.168.2.10

Server 端等待中.........

Mon Dec 05 20:00:01 CST 2011 接收訊息 client3:java 一級棒

Client IP:127.0.0.1

Server 端等待中.........

Client 端程式-1(192.168.2.10) h:\program1>javac Client.java

h:\program1>java Client client1 192.168.2.2

使用者名稱:client1

伺服器 IP 位址:192.168.2.2

請在提示符號後輸入要傳送的字串!

<client1 #>運動身體好

Client 資料已傳送了

Server 回應:Mon Dec 05 19:58:54 CST 2011 收到 client1:運動身體好

<client1 #>

Client 端程式-2(192.168.2.10) h:\program1>java Client client2 192.168.2.2

使用者名稱:client2

伺服器 IP 位址:192.168.2.2

請在提示符號後輸入要傳送的字串!

<client2 #>最愛學電腦

Client 資料已傳送了

Server 回應:Mon Dec 05 19:59:27 CST 2011 收到 client2:最愛學電腦

<client2 #>

Client 端程式-3(127.0.0.1) c:\program1>javac Client.java

c:\program1>java Client client3

使用者名稱:client3

請在提示符號後輸入要傳送的字串!

<client3 #>java 一級棒

Client 資料已傳送了

Server 回應:Mon Dec 05 20:00:01 CST 2011 收到 client3:java 一級棒

<client3 #>

Page 29: 國岷善化高中 蕭嘉岙蕭嘉岙 老窯 - tn.edu.twicerc.tnssh.tn.edu.tw/download/tm/100-1-5.pdf · 過Java.net窆峋,讓撰寫程式者崊取網路上的資源,舉凡像是IP定址、TCP

28

範例程式 4-2:MServerR.java

// 範例程式 MServerR.java,示範 Server 端實作 Runnable Interface,達到多工執行緒之功能

import java.net.*;

import java.io.*;

import java.lang.*;

import java.util.*;

class Server_RunClass implements Runnable

{

//建立資料流與網路類別物件

private InputStreamReader Origin_input;

private BufferedReader Buffer_input;

private PrintWriter Output_data;

private Socket msocket;

private InetAddress Javaclient;

//建構函數

public Server_RunClass(Socket MsSocket)

{

try

{

msocket = MsSocket;

Origin_input = new InputStreamReader(msocket.getInputStream());

Buffer_input = new BufferedReader(Origin_input);

Output_data = new PrintWriter(msocket.getOutputStream());

Javaclient = msocket.getInetAddress();

}

catch(IOException e)

{

System.err.println(e);

}

}

public void run()

{

try

{

//等待 client 端傳入資料

String msg_fromClient = Buffer_input.readLine();

//取得系統時間

Date transfer_date = new Date();

System.out.println(transfer_date.toString()+" 接收訊息 "+msg_fromClient);

//列出 Client(s)端的來源 IP

System.out.println("Client 端連線 ip 是" + Javaclient.getHostAddress());

//將資料至傳回 Client 端

Output_data.println(transfer_date.toString()+" 收到 "+msg_fromClient+"\n");

Output_data.flush();

System.out.println("\nServer 端等待中.........");

}

catch(IOException e)

{

System.err.println(e);

}

}

}

Page 30: 國岷善化高中 蕭嘉岙蕭嘉岙 老窯 - tn.edu.twicerc.tnssh.tn.edu.tw/download/tm/100-1-5.pdf · 過Java.net窆峋,讓撰寫程式者崊取網路上的資源,舉凡像是IP定址、TCP

29

範例程式 4-2:MServerR.java

public class MServerR

{

public static void main(String args[])

{

if(args.length != 1)

{ //指定 Server 端,命令與參數的格式

System.err.println("使用語法 : Java MServer 伺服器名稱");

System.exit(1); //結束程式

}

System.out.println("Java MServer 伺服器名稱:"+args[0]);

System.out.println("Server 端實作 Runable 界面多重執行緒程式已在啟動狀態...");

try

{

//建立 ServerSocket 類別之物件,並且設定通訊埠

ServerSocket Socket_Obj = new ServerSocket(10000);

while(true)

{

//等待 Client(s)連線進入

Socket JavaSocket = Socket_Obj.accept();

//將實作 Runnable 的物件當做參數,傳給 Thread 類別物件的建構函數。

Thread Server_thread= new Thread(new Server_RunClass(JavaSocket));

//利用 Thread 類別物件執行 start(),多工執行緒開始執行。

Server_thread.start();

}

}

catch(IOException e)

{

System.err.println(e);

}

}

}

Page 31: 國岷善化高中 蕭嘉岙蕭嘉岙 老窯 - tn.edu.twicerc.tnssh.tn.edu.tw/download/tm/100-1-5.pdf · 過Java.net窆峋,讓撰寫程式者崊取網路上的資源,舉凡像是IP定址、TCP

30

範例程式 4-2:MServerR.java、Client.java 執行結果

Server 端程式(192.168.2.2)

c:\program1>javac MServerR.java

c:\program1>java MServerR Runable_Server

Java MServer 伺服器名稱:Runable_Server

Server 端實作 Runable 界面多重執行緒程式已在啟動狀態...

Mon Dec 05 20:16:45 CST 2011 接收訊息 client1:春天慢跑最快樂

Client 端連線 ip 是 192.168.2.10

Server 端等待中.........

Mon Dec 05 20:17:09 CST 2011 接收訊息 client2:夏天游泳最消暑

Client 端連線 ip 是 192.168.2.10

Server 端等待中.........

Mon Dec 05 20:17:44 CST 2011 接收訊息 client3:秋天溜直排最過癮

Client 端連線 ip 是 127.0.0.1

Server 端等待中.........

Mon Dec 05 20:18:02 CST 2011 接收訊息 client4:冬天最想睡到自然醒

Client 端連線 ip 是 127.0.0.1

Server 端等待中.........

Client 端程式-1(192.168.2.10) h:\program1>javac Client.java

h:\program1>java Client client1 192.168.2.2

使用者名稱:client1

伺服器 IP 位址:192.168.2.2

請在提示符號後輸入要傳送的字串!

<client1 #>春天慢跑最快樂

Client 資料已傳送了

Server 回應:Mon Dec 05 20:16:45 CST 2011 收到 client1:春天慢跑最快樂

<client1 #>

Client 端程式-2(192.168.2.10) h:\program1>java Client client2 192.168.2.2

使用者名稱:client2

伺服器 IP 位址:192.168.2.2

請在提示符號後輸入要傳送的字串!

<client2 #>夏天游泳最消暑

Client 資料已傳送了

Server 回應:Mon Dec 05 20:17:09 CST 2011 收到 client2:夏天游泳最消暑

<client2 #>

Client 端程式-3(127.0.0.1) c:\program1>javac Client.java

c:\program1>java Client client3

使用者名稱:client3

請在提示符號後輸入要傳送的字串!

<client3 #>秋天溜直排最過癮

Page 32: 國岷善化高中 蕭嘉岙蕭嘉岙 老窯 - tn.edu.twicerc.tnssh.tn.edu.tw/download/tm/100-1-5.pdf · 過Java.net窆峋,讓撰寫程式者崊取網路上的資源,舉凡像是IP定址、TCP

31

Client 資料已傳送了

Server 回應:Mon Dec 05 20:17:44 CST 2011 收到 client3:秋天溜直排最過癮

<client3 #>

Client 端程式-4(127.0.0.1) c:\program1>java Client client4

使用者名稱:client4

請在提示符號後輸入要傳送的字串!

<client4 #>冬天最想睡到自然醒

Client 資料已傳送了

Server 回應:Mon Dec 05 20:18:02 CST 2011 收到 client4:冬天最想睡到自然醒

<client4 #>