400 likes | 527 Views
課程參與度之評估方式. 上課時必須專心聽講,跟上進度,參與討論 扣 分項目 玩線上遊戲一次扣 1 分 玩手機一次扣 1 分 睡覺一次扣 1 分 聊天一次扣 1 分 無法回答老師提出的問題一次扣 1 分 加分項目 主動回答老師的問題一次加 2 分 找出老師程式中的錯誤一次加 1 分 修正老師程式中的錯誤一次加 4 分. 網路程式設計 第五章 Java 網路套件. 鄧姚文. 大綱. 位址類別 SocketAddress 類別 Socket 類別 URL 類別 URLConnection 類別. 5-1 位址類別.
E N D
課程參與度之評估方式 • 上課時必須專心聽講,跟上進度,參與討論 • 扣分項目 • 玩線上遊戲一次扣1分 • 玩手機一次扣1分 • 睡覺一次扣1分 • 聊天一次扣1分 • 無法回答老師提出的問題一次扣1分 • 加分項目 • 主動回答老師的問題一次加2分 • 找出老師程式中的錯誤一次加1分 • 修正老師程式中的錯誤一次加4分
大綱 位址類別 SocketAddress類別 Socket類別 URL類別 URLConnection類別
5-1 位址類別 InetAddressaddr= InetAddress.getByName("java.sun.com"); System.out.println(addr); ▌印出addr物件的結果為: java.sun.com/72.5.124.55 • java.net.InetAddress類別 • 用來表示主機名稱或IP位址 • InetAddress類別可用在TCP與UDP網路程式設計,利用類別方法getByName(String host)以DNS查詢主機名稱對應的IP位址:
5-1 位址類別 • InetAddress local = InetAddress.getLocalHost(); • System.out.println(local); ▌印出local物件的結果為(每台主機執行結果不盡相同): core2/192.168.1.10 • java.net.InetAddress類別 • 類別方法getLocalHost()可得到本機(localhost)的網址物件如下:
5-1 位址類別 InetAddressaddr= InetAddress.getByName("java.sun.com"); System.out.println(addr); ▌執行結果 java.sun.com/72.5.124.55 • InetAddress • InetAddress類別並不以建構子的方式產生物件,而是使用它的「靜態方法(static methods)」,以下是較常使用的方法: • 1. static InetAddress getByName(String host) • 給予一個主機名稱host字串,將回傳一個經DNS查詢得到的位址物件(包括主機名稱與IP位址),如下範例:
5-1 位址類別 • byte[] b = { 61 , 64 , 12 ,1 }; • InetAddressaddr = InetAddress.getByAddress(b); • System.out.println(addr); ▌執行結果 /61.64.12.1 • InetAddress • 2. static InetAddress getByAddress(byte[] addr) • 傳入一個以byte陣列表示的IP位址,得到一個位址物件。
5-1 位址類別 • InetAddressaddr = InetAddress.getLocalHost(); • System.out.println(addr); ▌執行結果 core2/169.254.4.238 • InetAddress • 3. static InetAddressgetLocalHost() • 取得本機的位址物件,如下:
5-1 位址類別 • InetAddressaddr[] = InetAddress.getAllByName("core2"); • for (inti=0; i<addr.length; i++){ • System.out.println(addr[i]);} • InetAddress • 4. static InetAddress[] getAllByName(String host) • 取得主機名稱host字串所對應的所有IP位址物件,回傳位址物件的陣列,如果本機有多個IP位址,可以由此方法取得所有IP位址物件
5-1 位址類別 ▌執行結果c ore2/169.254.4.238 core2/192.168.1.10 core2/192.168.174.1 core2/192.168.83.1 core2/fe80:0:0:0:e414:6431:bf2d:99b8%11 core2/fe80:0:0:0:14a6:270b:4ae5:8872%18 core2/fe80:0:0:0:2966:8bde:3f65:49ae%19 core2/fe80:0:0:0:886:d53a:7968:4ee%29 InetAddress
5-1 位址類別 • 取得本機的網路介面-NetworkInterface • JDK第6版內的java.net.NetworkInterface類別 • 提供更詳細的網路卡資訊 • 利用NetworkInterface類別的靜態方法可以得到網路介面的物件
5-1 位址類別 • NetworkInterface eth = NetworkInterface.getByName("eth0"); • System.out.println(eth.getName()); • System.out.println(eth.getDisplayName()); ▌執行結果 Eth0 Marvell Yukon 88E8001/8003/8010 PCI Gigabit Ethernet Controller • 取得本機的網路介面-NetworkInterface • 1. static NetworkInterface getByName(String name) • 傳入一個網路介面名稱,可得到符合該名稱的物件,若無符合的名稱,則回傳null值,如下:
5-1 位址類別 • Enumeration<NetworkInterface> ifs = NetworkInterface.getNetworkInterfaces(); • while (ifs.hasMoreElements()){ • NetworkInterfaceni = ifs.nextElement(); • System.out.println(ni.getName()); • System.out.println("是否正啟用:"+ni.isUp()); • } • 取得本機的網路介面-NetworkInterface • 2. static Enumeration<NetworkInterface> getNetworkInterfaces() • 若想列出主機上所有的網路介面,可使用本方法得到列舉集合,以下範例程式可列出所有的網路介面的名稱與其是否啟用:
5-1 位址類別 • ▌執行結果 • lo • 是否正啟用:true • net0 • 是否正啟用:false • net1 • 是否正啟用:false • net2 • 是否正啟用:false • net3 • 是否正啟用:false • ppp0 • 是否正啟用:false • eth0 • 是否正啟用:false • eth1 • 是否正啟用:false • eth2 • 是否正啟用:false
5-1 位址類別 • 常用的方法有: • String getName():取得網路介面的名稱字串,通常有eth0,eth1或net1,net2或ppp1,ppp2等。 • String getDisplayName():取得網路介面的易讀名稱字串,一般人較容易瞭解的名稱,如網路介面的品牌與型號。 • booleanisUp():回傳布林值,以辨認該網路介面是否處於啟用狀態。 • intgetMTU():得到該網路介面的「最大傳輸單位值(MTU)」。 • booleanisVirtual():回傳該網路介面是否為一個虛擬裝置,又稱為子介面(subinterface)。 • getSubInterfaces():得到該網路介面下的所有虛擬裝置。
5-2SocketAddress類別 SocketAddress抽象類別定義了一個未綁定任何通訊協定的規格,讓其他類別繼承 如TCP/IP協定所使用的InetSocketAddress類別,它是代表一個網址,而一個網址內有IP位址與埠號(port)兩項資訊
5-3Socket類別 java.net.Socket類別常用來建立Client/Server型的連線 建立連線後就可利用輸出入串流物件進行資料傳輸 TCP程式設計是先利用Socket類別,再利用串流物件
5-3Socket類別 • 建立Socket物件 • 最常使用的建構子是給予主機名稱字串與遠端主機的埠號(port),由於主機名稱不一定正確,或是遠端主機可能有無法連線的情況,因此使用Socket建構子時,必須為其處理UnknownHostException與IOException例外,當連線失敗時將會顯示「主機連線失敗」,如下以try...catch處理之:
5-3Socket類別 • try { • Socket ptt = new Socket("localhost ", 23); • }catch (UnknownHostException ex){ • System.out.println("主機連線失敗"); • }catch (IOException ex){ • System.out.println("傳輸失敗"); • } 建立Socket物件
5-3Socket類別 • try { • InetAddressaddr = InetAddress.getByName("localhost"); • Socket ptt = new Socket(addr, 23); • }catch (UnknownHostException ex){ • System.out.println("主機連線失敗"); • } catch (IOException ex){ • System.out.println("傳輸失敗"); • } • 建立Socket物件 • 當程式執行到Socket建構子時,會直接嘗試與遠端主機的埠號建立TCP連線。Socket類別建構子還可以使用InetAddress物件與遠端主機建立連線,程式範例如下:
5-3Socket類別 • Socket的方法 • public SocketAddressgetLocalSocketAddress():取得本地的SocketAddress物件。 • public SocketAddressgetRemoteSocketAddress():取得連線遠端的SocketAddress物件。 • public void bind(SocketAddressbindpoint):將Socket物件綁定一個本地位址。
5-3Socket類別 • Socket的方法 • public void connect(SocketAddress endpoint):使用SocketAddress物件內的資訊,連線至其指定的遠端主機 • public void connect(SocketAddress endpoint, int timeout):使用SocketAddress物件內的資訊,連線至其指定的遠端主機,並訂定連線超過某一時間無法成功時,即告失敗。timeout值以毫秒(千分之一秒)為單位。
5-3Socket類別 • Socket的方法 • public InetAddressgetInetAddress():取得連線至遠端的位址物件。 • public intgetPort():取得連線至遠端的埠號值。 • public InetAddressgetLocalAddress():取得此連線在本地端的位址物件。 • public intgetLocalPort():取得此連線在本地端的埠號值。
5-3Socket類別 • Socket的方法 • public InputStreamgetInputStream():取得此連線的輸入資料流物件,以供後續讀取遠端傳送來的資料。 • public OutputStreamgetOutputStream():取得此連線的輸出資料流物件,以供後續傳送資料至遠端主機。 • public void close():關閉此連線。
5-3Socket類別 • 取得輸出入串流 • 當Socket物件成功建立後,客戶端(程式)與伺服器端(遠端主機)可開始進行資料的傳輸 • 利用java.io套件庫內的串流類別(Stream),如簡單的InputStream/OutputStream或支援亞洲字元的Reader/Writer類別
01 package com.ch05; 02 03 import java.io.IOException; 04 import java.io.InputStream; 05 import java.io.OutputStream; 06 import java.net.Socket; 07 import java.net.UnknownHostException; 08 09 public class SimpleTCP { 10 public static void main(String[] args) { 11 try { 12 Socket ptt = new Socket("ptt.cc",23); 13 InputStream in = ptt.getInputStream(); 14 OutputStream out = ptt.getOutputStream(); 15 } catch (UnknownHostException e) { 16 System.out.println("主機連線失敗"); 17 } catch (IOException e) { 18 System.out.println("傳輸失敗"); 19 } 20 } 21 }
5-3Socket類別 • 傳輸資料 • 利用串流物件提供的方法,進行資料的接收與傳送 • 資料接收以InputStream的read()方法 • 資料傳送以OutputStream的write()方法
5-3Socket類別 • 關閉連線 • 當程式執行至main方法的最後時,會結束整個程式,並自動將程式中使用到的變數、物件等資源釋出,但讀者在設計網路連線相關程式時,最好利用串流物件與通道物件的close()方法,主動地關閉其資源並斷線,以免遠端主機花費多餘的資源在等待斷線訊號。
5-3Socket類別 • Telnet程式範例 • 利用連線至PTT BBS,取得遠端主機傳輸資料為例,程式中在連線成功後,以for迴圈從BBS站(遠端主機)讀取10個位元組,並印出資料:
5-4URL類別 URL(Universal Resource Locator)稱為網址 URL是用來上找到(定位)一個特定的網路資源,也是一個表示特定網際網路資源的國際標準 通訊協定://伺服器位址或名稱[:埠號]/路徑/檔名 例如:http://www.ibm.com/docs/abc.txt
5-4URL類別 • URL標準制定了以下常用的通訊協定 • http • 網頁通訊協定 • https • 加密傳送的網頁通訊協定 • ftp • 檔案傳輸協定 • file • 定位本地電腦上的檔案
5-4URL類別 • URL url = new URL("http://snpy.org/net/index.html"); • URL url = new URL("http", "snpy.org", 80, "/net/index.html"); • URL的建構子 • 1.URL(String spec) • 傳入一個URL字串,並產生一個URL物件,例如: • 2.URL(String proto, String host, int port, String file) • 將URL的四個要項分開為字串與整數,傳入URL類別建構子當成參數,並產生一個URL物件,例如: • 3.URL(String proto, String host, String file) • 使用預設的埠別,而需不傳入埠號參數,在URL物件中埠號的預設值為-1,代表使用該協定的預設埠號,若協定為ftp則預設使用21埠號,若協定為http則使用80埠號。
5-4URL類別 • URL類別的方法 • String getProtocol():取得URL物件內的協定,回傳值為字串格式。 • String getHost():取得URL物件內的主機資訊,回傳值為字串格式。 • String getPort():取得URL物件內的埠號值,回傳值為整數格式。 • String getPath():取得URL物件內的目錄資訊(包括檔案),回傳值為字串格式。 • String getFile():取得URL物件內的檔案名稱(包括目錄),回傳值為字串格式。
5-4URL類別 • URL類別的方法 • URLConnection openConnection():依照URL物件中的欄位資訊開啟該資源,並回傳與該資源的URLConnection連線物件,後續可進行資料的讀取與傳送。URLConnection類別將於下一節內容中詳述。 • InputStream openStream():依照URL物件中的欄位資訊開啟該資源,回傳連線後的輸入資源流InputStream,可快速讀取遠端資源中的資料。
5-5URLConnection類別 • URLConnection類別代表與該網際網路資源的實質連線 • 由實質連線中可以得到輸出/入資料流物件 • URL相當於寫著住址的紙張,URLConnection依照紙張上的資訊建立本機與遠端資源的橋樑
5-5URLConnection類別 URL url = new URL("http://j.snpy.org/net/index.html"); URLConnectionconn = url.openConnection(); conn.connect(); InputStream in = conn.getInputStream(); • 取得網際網路資源 • 想要連線到下列網址,並取得該網址的資料: • http://j.snpy.org/net/index.html • 1. 產生URL物件 • 2. 取得URLConnection連線物件 • 3. 與該資源建立實質連線 • 4. 取得輸入資料流物件
5-5URLConnection類別 • int data = in.read(); • while (data!=-1){ • System.out.print((char)data); • data = in.read(); • } in.close(); • 取得網際網路資源 • 5. 以迴圈取得所有資料 • 6. 關閉資料流物件
5-5URLConnection類別 • String type = conn.getContentType(); • System.out.println("內文格式:"+type); • 標頭(Header)資訊 • 先利用URLConnection的方法getContentType()取得遠端資源的「內文(Content)」格式 • 得到: text/html; charset=UTF-8
本章結束 Q&A討論時間