29.06.2013 Views

Java Socket Programming 大綱 - 網路資料庫實驗室

Java Socket Programming 大綱 - 網路資料庫實驗室

Java Socket Programming 大綱 - 網路資料庫實驗室

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>Java</strong> <strong>Socket</strong> <strong>Programming</strong><br />

<strong>大綱</strong><br />

Bi-Ru Dai<br />

<strong>Java</strong>網路程式設計概念<br />

活用URL<br />

使用socket?<br />

使用datagram?<br />

<strong>Java</strong> <strong>Socket</strong> <strong>Programming</strong> 2<br />

1


網路程式設計概念<br />

<strong>Java</strong>使網路程式設計變得很簡單<br />

不必須要考慮底層網路資料溝通的問題<br />

Ex:<br />

網頁中使用Applet 來顯示圖片<br />

IP 基礎網路架構<br />

<strong>Java</strong> <strong>Socket</strong> <strong>Programming</strong> 3<br />

<strong>Java</strong> <strong>Socket</strong> <strong>Programming</strong> 4<br />

2


所需要了解課題<br />

設計應用層的程式<br />

當然也需要了解TCP/UDP 運作原理<br />

使用 java.net 類別<br />

TCP<br />

<strong>Java</strong> <strong>Socket</strong> <strong>Programming</strong> 5<br />

Transmission Control Protocol<br />

兩個應用程式建立一個通道,互相傳送訊<br />

息<br />

Ex:如同打電話一般<br />

依據網路特性可分成<br />

Packet switch<br />

Circuit switch<br />

<strong>Java</strong> <strong>Socket</strong> <strong>Programming</strong> 6<br />

3


TCP<br />

在網路上,把資料依照順序地彼此傳遞是<br />

一件困難的事<br />

提供可靠的點對點的連線方式(Point to<br />

Point Channel)<br />

需要可靠連線方式的應用<br />

Ex:HTTP,FTP,TELNET<br />

UDP<br />

User datagram Protocol<br />

<strong>Java</strong> <strong>Socket</strong> <strong>Programming</strong> 7<br />

傳送分別獨立的封包資料,不保證資料是否<br />

送到,跟TCP的理念不同<br />

提供不保證能把資料正確地在應用程式<br />

間傳輸<br />

並不是Connection-Based;TCP是<br />

Connection-Based<br />

<strong>Java</strong> <strong>Socket</strong> <strong>Programming</strong> 8<br />

4


UDP<br />

資料先被分成許多個小部份,傳輸出去.其<br />

被傳出去被收到的順序不重要<br />

對許多的應用程式而言,使很難去保證資<br />

料在網路上傳輸會沒有任何的流失<br />

因此,為使資料沒有傳送上的錯誤而使用<br />

可以確保資料傳輸品質的通訊協定,反而<br />

會使網路的品質變壞影響到原有應用程<br />

式或網路服務的服務品質<br />

UDP<br />

<strong>Java</strong> <strong>Socket</strong> <strong>Programming</strong> 9<br />

適合一些應用程式可以容許再網路上傳<br />

送上流失一些資料,一則是丟棄他或是利<br />

用其他成功傳遞成功的資料來組成<br />

應用範例:<br />

時間服務伺服器(Time server)<br />

Ping service 用來了解網路連線的狀態<br />

<strong>Java</strong> <strong>Socket</strong> <strong>Programming</strong> 10<br />

5


了解連接阜(Port)<br />

一般來說,電腦一般都具有一個實體連線<br />

的介面,所有的資料都是解由這一個連線<br />

來傳輸<br />

然而,這些傳輸的資料都是給不同的應用<br />

程式,如何來分別他們呢 ?<br />

使用連接阜來區別<br />

連接阜<br />

<strong>Java</strong> <strong>Socket</strong> <strong>Programming</strong> 11<br />

網路資料的傳輸一定伴隨著目的地的電<br />

腦位置與連接阜資料<br />

電腦位址:IPv4,32bit<br />

連接阜:16bit<br />

這樣一來,TCP/UDP就可以很順利的傳輸<br />

資料<br />

<strong>Java</strong> <strong>Socket</strong> <strong>Programming</strong> 12<br />

6


以TCP 為例<br />

伺服器將IP與Port合併一起,好讓客戶<br />

端可以知道如何與伺服器相連接<br />

以UDP為例<br />

<strong>Java</strong> <strong>Socket</strong> <strong>Programming</strong> 13<br />

資料裡面只有包含目的地的IP與Port資料<br />

根據Port資料來區別不同的應用程式<br />

<strong>Java</strong> <strong>Socket</strong> <strong>Programming</strong> 14<br />

7


使用Port<br />

所有可以使用的Port :<br />

0~65535<br />

0~1023 常用的網路服務<br />

使用者制定的服務 1024~65535<br />

<strong>Java</strong>提供的程式庫<br />

java.net<br />

TCP<br />

<strong>Java</strong> <strong>Socket</strong> <strong>Programming</strong> 15<br />

URL, URLConnection, <strong>Socket</strong>, and<br />

Server<strong>Socket</strong><br />

UDP<br />

DatagramPacket, Datagram<strong>Socket</strong>, and<br />

Multicast<strong>Socket</strong><br />

<strong>Java</strong> <strong>Socket</strong> <strong>Programming</strong> 16<br />

8


活用URL<br />

什麼是URL?<br />

建立URL<br />

解析URL<br />

讀取URL的目錄<br />

URL連線<br />

URL連線的讀取與輸出<br />

什麼是URL?<br />

<strong>Java</strong> <strong>Socket</strong> <strong>Programming</strong> 17<br />

Uniform Resource Locator<br />

是用來識別網路上的電腦<br />

Ex: http://java.sun.com<br />

http:傳輸協定<br />

java.sun.com資源名稱<br />

<strong>Java</strong> <strong>Socket</strong> <strong>Programming</strong> 18<br />

9


URL<br />

Host Name The name of the machine on which the resource lives.<br />

Filename The pathname to the file on the machine.<br />

Port<br />

Number<br />

Reference<br />

The port number to which to connect (typically optional).<br />

A reference to a named anchor within a resource that usually<br />

identifies a specific location within a file (typically optional<br />

建立URL<br />

使用字串來表示URL<br />

http://www.ntu.edu.tw<br />

<strong>Java</strong> <strong>Socket</strong> <strong>Programming</strong> 19<br />

URL ntu=new URL(http://www.ntu.edu.tw)<br />

除了使用絕對的URL 也可以使用 相對的<br />

URL<br />

<strong>Java</strong> <strong>Socket</strong> <strong>Programming</strong> 20<br />

10


相對URL<br />

通常被使用在網頁中所連結到通一個網<br />

站網頁的連結<br />

Example<br />

In a page contains the following pages in the same site:<br />

Pictures of Me<br />

Pictures of My Kids<br />

Using relative URL to represent:<br />

URL gamelan = new URL("http://www.gamelan.com/pages/");<br />

URL gamelanGames = new URL(gamelan, "Gamelan.game.html");<br />

URL gamelanNetwork = new URL(gamelan, "Gamelan.net.html");<br />

URL語法<br />

語法:<br />

<strong>Java</strong> <strong>Socket</strong> <strong>Programming</strong> 21<br />

URL(URL baseURL, String relativeURL)<br />

Ex:<br />

URL gamelanNetworkBottom = new<br />

URL(gamelanNetwork, "#BOTTOM");<br />

<strong>Java</strong> <strong>Socket</strong> <strong>Programming</strong> 22<br />

11


解析URL<br />

getProtocol<br />

Returns the protocol identifier component of the URL.<br />

getHost<br />

Returns the host name component of the URL.<br />

getPort<br />

Returns the port number component of the URL. The<br />

getPort method returns an integer that is the port<br />

number. If the port is not set, getPort returns -1.<br />

getFile<br />

Returns the filename component of the URL.<br />

getRef<br />

Returns the reference component of the URL.<br />

Example<br />

100. import java.net.*;<br />

101. import java.io.*;<br />

102. public class ParseURL {<br />

<strong>Java</strong> <strong>Socket</strong> <strong>Programming</strong> 23<br />

103. public static void main(String[] args) throws Exception {<br />

104. URL aURL = new URL("http://java.sun.com:80/docs/books/"<br />

105. + "tutorial/index.html#DOWNLOADING");<br />

106. System.out.println("protocol = " + aURL.getProtocol());<br />

107. System.out.println("host = " + aURL.getHost());<br />

108. System.out.println("filename = " + aURL.getFile());<br />

109. System.out.println("port = " + aURL.getPort());<br />

110. System.out.println("ref = " + aURL.getRef());<br />

111. }<br />

112. }<br />

<strong>Java</strong> <strong>Socket</strong> <strong>Programming</strong> 24<br />

12


讀取URL資料<br />

100. import java.net.*;<br />

101. import java.io.*;<br />

102. public class URLReader {<br />

103. public static void main(String[] args) throws Exception {<br />

104. URL yahoo = new URL("http://www.yahoo.com/");<br />

105. BufferedReader in = new BufferedReader(<br />

106. new InputStreamReader(<br />

107. yahoo.openStream()));<br />

108. String inputLine;<br />

109. while ((inputLine = in.readLine()) != null)<br />

110. System.out.println(inputLine);<br />

111. in.close();<br />

112. }<br />

113. }<br />

URL連線錯誤處理<br />

100. try {<br />

<strong>Java</strong> <strong>Socket</strong> <strong>Programming</strong> 25<br />

101. URL yahoo = new URL("http://www.yahoo.com/");<br />

102. URLConnection yahooConnection =<br />

yahoo.openConnection();<br />

103. } catch (MalformedURLException e) { // new URL() failed<br />

104. . . .<br />

105. } catch (IOException e) { // openConnection() failed<br />

106. . . .<br />

107. }<br />

<strong>Java</strong> <strong>Socket</strong> <strong>Programming</strong> 26<br />

13


URL連線的讀取與輸出<br />

讀取<br />

URLConnectionRead.java<br />

輸出<br />

Reverse.java<br />

使用socket?<br />

<strong>Java</strong> <strong>Socket</strong> <strong>Programming</strong> 27<br />

在網路上兩個程式雙向連線的一端<br />

利用socket 從client連線到server與讀取<br />

server的資料<br />

詳細介紹使用java在client-server架構下<br />

的連線模式<br />

<strong>Java</strong> <strong>Socket</strong> <strong>Programming</strong> 28<br />

14


關於sockets<br />

URL 與 URLConnection提供相對較高階<br />

機制在網路上存取資源<br />

有時候,需要較低階網路連線的溝通<br />

舉例來說,撰寫一個client-server應用程式<br />

<strong>Java</strong> <strong>Socket</strong> <strong>Programming</strong> 29<br />

Client-server應用程式<br />

Server提供某些服務,像是處理資料庫的<br />

查詢或是傳送現在的股價<br />

Client使用這些server提供的資訊,不論是<br />

顯示查詢資料庫的結果或是提供投資者<br />

購買股票的建議<br />

<strong>Java</strong> <strong>Socket</strong> <strong>Programming</strong> 30<br />

15


Client-server應用程式<br />

建置在TCP上面<br />

TCP提供穩定點對點連線的通道<br />

透過TCP,client與server需要建立彼此的<br />

連線<br />

需要用socket將每一個程式與其另一連線<br />

端結合起來<br />

在這個連線下,client 與 server可以換傳<br />

資料<br />

<strong>Socket</strong>連線方式<br />

<strong>Java</strong> <strong>Socket</strong> <strong>Programming</strong> 31<br />

正常來說,server會在特定port上設定一個<br />

包含這一個port資訊的socket<br />

接著,server就等待,聆聽要連線到這一個<br />

socket的client<br />

在client端,client需要知道主機名稱<br />

(hostname)與其提供連線的port<br />

<strong>Java</strong> <strong>Socket</strong> <strong>Programming</strong> 32<br />

16


Client需要連線到server時<br />

當需要連線時,Client會試著與這一個主機<br />

及其port連線<br />

<strong>Java</strong> <strong>Socket</strong> <strong>Programming</strong> 33<br />

Server接受client連線<br />

如果沒任何問題,server會接受連線<br />

Server產生新的且包含不同port的socket<br />

因為需要保留原有socket來接收新的連線<br />

與維持已連線的資料傳輸品質<br />

<strong>Java</strong> <strong>Socket</strong> <strong>Programming</strong> 34<br />

17


連線完成<br />

在client端會接收到連線被確認的訊息,以<br />

確認socket連線建立完成,可以透過這一<br />

個socket來傳遞資料<br />

Client端的socket並不會包含與server連<br />

線的相同port號碼.然而,client會另外指定<br />

一個port給client執行的程式用<br />

<strong>Socket</strong> in <strong>Java</strong><br />

<strong>Java</strong> <strong>Socket</strong> <strong>Programming</strong> 35<br />

java.net.socket建置在平台相關實作上的<br />

最上層,隱藏所有系統細節<br />

所以利用java.net.socket所建置網路程式<br />

可以做到跨平台的特性<br />

java.net.serversocket 提供建置伺服器<br />

的socket<br />

<strong>Java</strong> <strong>Socket</strong> <strong>Programming</strong> 36<br />

18


<strong>Socket</strong> 讀取<br />

Echo Service uses port 7<br />

Echo client<br />

Client與server建立連線後,client送給<br />

server字串訊息,server都回傳相同的訊息<br />

給client顯示出來<br />

KnockKnock Service<br />

Server<br />

KnockKnockServer.java<br />

<strong>Java</strong> <strong>Socket</strong> <strong>Programming</strong> 37<br />

KnockKnockProtocol.java<br />

Client<br />

KnockKnockClient.java<br />

<strong>Java</strong> <strong>Socket</strong> <strong>Programming</strong> 38<br />

19


支援多人同時連線的KKserver<br />

KKMultiServer<br />

KKMultiServerThread<br />

使用datagram<br />

什麼是datagram<br />

<strong>Java</strong> <strong>Socket</strong> <strong>Programming</strong> 39<br />

Datagram client-server架構<br />

廣播給許多的接收者<br />

<strong>Java</strong> <strong>Socket</strong> <strong>Programming</strong> 40<br />

20


什麼是datagram<br />

是一個獨立,且包含所要傳送資料的電腦<br />

資料格式<br />

並不保證會到達,到達時間與傳遞內容<br />

應用程式透過datagram傳遞與接收資料<br />

是完全獨立且沒有關係的<br />

Client與server並不需要透過連線來傳送<br />

資料<br />

UDP與TCP比較<br />

<strong>Java</strong> <strong>Socket</strong> <strong>Programming</strong> 41<br />

TCP:client與server建立穩定的點對點連<br />

線,在上面傳遞資料.需要「建立連線」,<br />

「互傳資料」與「結束連線」三個主要<br />

步驟.資料傳送是保證的.<br />

UDP:client與server不需要建立連線,傳送<br />

資料與接收資料是不相關的.資料傳送是<br />

不保證的.<br />

<strong>Java</strong> <strong>Socket</strong> <strong>Programming</strong> 42<br />

21


Quote範例<br />

java.net的 Datagram<strong>Socket</strong><br />

QuoteClient送空的資料給QuoteServer<br />

QuoteServer就回傳資料給<br />

QuoteClientClient<br />

類似ping的功能<br />

Quote 範例<br />

<strong>Java</strong> <strong>Socket</strong> <strong>Programming</strong> 43<br />

Server listens on port 4445<br />

QuoteServer.java<br />

QuoteServerThread.java<br />

Client<br />

QuoteClient.java<br />

QuoteClientApplet.java<br />

QUoteClientApplet.html<br />

<strong>Java</strong> <strong>Socket</strong> <strong>Programming</strong> 44<br />

22


廣播訊息給多個接收者<br />

與之前範例不同,server等待client.<br />

多個Client聆聽server送出的訊息<br />

修改Datagram<strong>Socket</strong><br />

Server固定一個時間會送出訊息給client<br />

<strong>Java</strong> <strong>Socket</strong> <strong>Programming</strong> 45<br />

Quote Multicast範例<br />

Multicast Server<br />

MultiCastServer.java<br />

MultiCastThread.java<br />

Multicast Client<br />

MultiClient.java<br />

<strong>Java</strong> <strong>Socket</strong> <strong>Programming</strong> 46<br />

23


Reference<br />

Custom Networking<br />

(http://java.sun.com/docs/books/<br />

tutorial/networking/TOC.html)<br />

IETF (http://www.ietf.org/)<br />

<strong>Java</strong> <strong>Socket</strong> <strong>Programming</strong> 47<br />

24

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!