Java Socket Programming 大綱 - 網路資料庫實驗室
Java Socket Programming 大綱 - 網路資料庫實驗室
Java Socket Programming 大綱 - 網路資料庫實驗室
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