1 / 40

課程參與度之評估方式

課程參與度之評估方式. 上課時必須專心聽講,跟上進度,參與討論 扣 分項目 玩線上遊戲一次扣 1 分 玩手機一次扣 1 分 睡覺一次扣 1 分 聊天一次扣 1 分 無法回答老師提出的問題一次扣 1 分 加分項目 主動回答老師的問題一次加 2 分 找出老師程式中的錯誤一次加 1 分 修正老師程式中的錯誤一次加 4 分. 網路程式設計 第五章 Java 網路套件. 鄧姚文. 大綱. 位址類別 SocketAddress 類別 Socket 類別 URL 類別 URLConnection 類別. 5-1 位址類別.

Download Presentation

課程參與度之評估方式

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 課程參與度之評估方式 • 上課時必須專心聽講,跟上進度,參與討論 • 扣分項目 • 玩線上遊戲一次扣1分 • 玩手機一次扣1分 • 睡覺一次扣1分 • 聊天一次扣1分 • 無法回答老師提出的問題一次扣1分 • 加分項目 • 主動回答老師的問題一次加2分 • 找出老師程式中的錯誤一次加1分 • 修正老師程式中的錯誤一次加4分

  2. 網路程式設計第五章 Java網路套件 鄧姚文

  3. 大綱 位址類別 SocketAddress類別 Socket類別 URL類別 URLConnection類別

  4. 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. 5-1 位址類別 • InetAddress local = InetAddress.getLocalHost(); • System.out.println(local); ▌印出local物件的結果為(每台主機執行結果不盡相同): core2/192.168.1.10 • java.net.InetAddress類別 • 類別方法getLocalHost()可得到本機(localhost)的網址物件如下:

  6. 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位址),如下範例:

  7. 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位址,得到一個位址物件。

  8. 5-1 位址類別 • InetAddressaddr = InetAddress.getLocalHost(); • System.out.println(addr); ▌執行結果 core2/169.254.4.238 • InetAddress • 3. static InetAddressgetLocalHost() • 取得本機的位址物件,如下:

  9. 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位址物件

  10. 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

  11. 5-1 位址類別 • 取得本機的網路介面-NetworkInterface • JDK第6版內的java.net.NetworkInterface類別 • 提供更詳細的網路卡資訊 • 利用NetworkInterface類別的靜態方法可以得到網路介面的物件

  12. 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值,如下:

  13. 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() • 若想列出主機上所有的網路介面,可使用本方法得到列舉集合,以下範例程式可列出所有的網路介面的名稱與其是否啟用:

  14. 5-1 位址類別 • ▌執行結果 • lo • 是否正啟用:true • net0 • 是否正啟用:false • net1 • 是否正啟用:false • net2 • 是否正啟用:false • net3 • 是否正啟用:false • ppp0 • 是否正啟用:false • eth0 • 是否正啟用:false • eth1 • 是否正啟用:false • eth2 • 是否正啟用:false

  15. 5-1 位址類別 • 常用的方法有: • String getName():取得網路介面的名稱字串,通常有eth0,eth1或net1,net2或ppp1,ppp2等。 • String getDisplayName():取得網路介面的易讀名稱字串,一般人較容易瞭解的名稱,如網路介面的品牌與型號。 • booleanisUp():回傳布林值,以辨認該網路介面是否處於啟用狀態。 • intgetMTU():得到該網路介面的「最大傳輸單位值(MTU)」。 • booleanisVirtual():回傳該網路介面是否為一個虛擬裝置,又稱為子介面(subinterface)。 • getSubInterfaces():得到該網路介面下的所有虛擬裝置。

  16. 5-2SocketAddress類別 SocketAddress抽象類別定義了一個未綁定任何通訊協定的規格,讓其他類別繼承 如TCP/IP協定所使用的InetSocketAddress類別,它是代表一個網址,而一個網址內有IP位址與埠號(port)兩項資訊

  17. 5-2SocketAddress類別

  18. 5-3Socket類別 java.net.Socket類別常用來建立Client/Server型的連線 建立連線後就可利用輸出入串流物件進行資料傳輸 TCP程式設計是先利用Socket類別,再利用串流物件

  19. 5-3Socket類別 • 建立Socket物件 • 最常使用的建構子是給予主機名稱字串與遠端主機的埠號(port),由於主機名稱不一定正確,或是遠端主機可能有無法連線的情況,因此使用Socket建構子時,必須為其處理UnknownHostException與IOException例外,當連線失敗時將會顯示「主機連線失敗」,如下以try...catch處理之:

  20. 5-3Socket類別 • try { • Socket ptt = new Socket("localhost ", 23); • }catch (UnknownHostException ex){ • System.out.println("主機連線失敗"); • }catch (IOException ex){ • System.out.println("傳輸失敗"); • } 建立Socket物件

  21. 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物件與遠端主機建立連線,程式範例如下:

  22. 5-3Socket類別 • Socket的方法 • public SocketAddressgetLocalSocketAddress():取得本地的SocketAddress物件。 • public SocketAddressgetRemoteSocketAddress():取得連線遠端的SocketAddress物件。 • public void bind(SocketAddressbindpoint):將Socket物件綁定一個本地位址。

  23. 5-3Socket類別 • Socket的方法 • public void connect(SocketAddress endpoint):使用SocketAddress物件內的資訊,連線至其指定的遠端主機 • public void connect(SocketAddress endpoint, int timeout):使用SocketAddress物件內的資訊,連線至其指定的遠端主機,並訂定連線超過某一時間無法成功時,即告失敗。timeout值以毫秒(千分之一秒)為單位。

  24. 5-3Socket類別 • Socket的方法 • public InetAddressgetInetAddress():取得連線至遠端的位址物件。 • public intgetPort():取得連線至遠端的埠號值。 • public InetAddressgetLocalAddress():取得此連線在本地端的位址物件。 • public intgetLocalPort():取得此連線在本地端的埠號值。

  25. 5-3Socket類別 • Socket的方法 • public InputStreamgetInputStream():取得此連線的輸入資料流物件,以供後續讀取遠端傳送來的資料。 • public OutputStreamgetOutputStream():取得此連線的輸出資料流物件,以供後續傳送資料至遠端主機。 • public void close():關閉此連線。

  26. 5-3Socket類別 • 取得輸出入串流 • 當Socket物件成功建立後,客戶端(程式)與伺服器端(遠端主機)可開始進行資料的傳輸 • 利用java.io套件庫內的串流類別(Stream),如簡單的InputStream/OutputStream或支援亞洲字元的Reader/Writer類別

  27. 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 }

  28. 5-3Socket類別 • 傳輸資料 • 利用串流物件提供的方法,進行資料的接收與傳送 • 資料接收以InputStream的read()方法 • 資料傳送以OutputStream的write()方法

  29. 5-3Socket類別 • 關閉連線 • 當程式執行至main方法的最後時,會結束整個程式,並自動將程式中使用到的變數、物件等資源釋出,但讀者在設計網路連線相關程式時,最好利用串流物件與通道物件的close()方法,主動地關閉其資源並斷線,以免遠端主機花費多餘的資源在等待斷線訊號。

  30. 5-3Socket類別 • Telnet程式範例 • 利用連線至PTT BBS,取得遠端主機傳輸資料為例,程式中在連線成功後,以for迴圈從BBS站(遠端主機)讀取10個位元組,並印出資料:

  31. 5-4URL類別 URL(Universal Resource Locator)稱為網址 URL是用來上找到(定位)一個特定的網路資源,也是一個表示特定網際網路資源的國際標準 通訊協定://伺服器位址或名稱[:埠號]/路徑/檔名 例如:http://www.ibm.com/docs/abc.txt

  32. 5-4URL類別 • URL標準制定了以下常用的通訊協定 • http • 網頁通訊協定 • https • 加密傳送的網頁通訊協定 • ftp • 檔案傳輸協定 • file • 定位本地電腦上的檔案

  33. 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埠號。

  34. 5-4URL類別 • URL類別的方法 • String getProtocol():取得URL物件內的協定,回傳值為字串格式。 • String getHost():取得URL物件內的主機資訊,回傳值為字串格式。 • String getPort():取得URL物件內的埠號值,回傳值為整數格式。 • String getPath():取得URL物件內的目錄資訊(包括檔案),回傳值為字串格式。 • String getFile():取得URL物件內的檔案名稱(包括目錄),回傳值為字串格式。

  35. 5-4URL類別 • URL類別的方法 • URLConnection openConnection():依照URL物件中的欄位資訊開啟該資源,並回傳與該資源的URLConnection連線物件,後續可進行資料的讀取與傳送。URLConnection類別將於下一節內容中詳述。 • InputStream openStream():依照URL物件中的欄位資訊開啟該資源,回傳連線後的輸入資源流InputStream,可快速讀取遠端資源中的資料。

  36. 5-5URLConnection類別 • URLConnection類別代表與該網際網路資源的實質連線 • 由實質連線中可以得到輸出/入資料流物件 • URL相當於寫著住址的紙張,URLConnection依照紙張上的資訊建立本機與遠端資源的橋樑

  37. 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. 取得輸入資料流物件

  38. 5-5URLConnection類別 • int data = in.read(); • while (data!=-1){ • System.out.print((char)data); • data = in.read(); • } in.close(); • 取得網際網路資源 • 5. 以迴圈取得所有資料 • 6. 關閉資料流物件

  39. 5-5URLConnection類別 • String type = conn.getContentType(); • System.out.println("內文格式:"+type); • 標頭(Header)資訊 • 先利用URLConnection的方法getContentType()取得遠端資源的「內文(Content)」格式 • 得到: text/html; charset=UTF-8

  40. 本章結束 Q&A討論時間

More Related