Java的網路知識

來源:互聯網
上載者:User

Java的網路知識

  1) 從網路上載入APPLE(小應用程式)

  現在的大多數瀏覽器都不約而同地對Java進行支援。在HTML語言中,在.html檔案的任何的位置上有一個特殊標記。這句話就是對小應用程式的引用。小應用程式沒有受到地區的限制,它可以在本地,也可以在Internet上的任何一個地方。其位置對於使用者來講是透明的。而對於瀏覽器來講,其位置在中被讀出,然後進行定位小應用程式,並運行它。如果小應用程式位於遠端電腦上,那麼瀏覽器就必須小載它,然後才可運行。

  (2) 從URL載入映像

  首先,必須先介紹URL。它表示一個通過資源定位器(Uniform Resource Locator),是網路上某些資源的地址。Java程式可以使用一個URL來引用或串連網路資源。如:

  如果需要從遠程載入一張圖時,Java程式必須先建立一個URL,以包含映像的地址。

  URL是Java程式裡進階別的互動功能。

  二、URL及其使用

  URL代表通用資源定位器。將URL提供給網路瀏覽器,那麼它就可以在Internet上尋找並定位檔案。在編寫Java程式時,也可以用URL在互連網上尋找希望訪問的資源。類組java.net中包含一個名為URL的類,Java可以使用它來表示一個URL地址。

  這裡需要區別的是:URL地址表示一個Internet地址,而URL對象則指代Java程式中的類URL的一個執行個體。

  (1) URL的定義

  URL是一個縮寫,代表通過資源定位(Uniform Resource Locator),是對Internet資源的一個引用(一個地址)。

  URL不但可以表示網路上的一個檔案的名稱,而且可以指向網路上的其它資源,如:資料庫查詢和命令輸出。如:

  http://java.sun.com//

  所有的URL擁有兩個主要的組成部分:

  (1) 協議辨識符;

  (2) 資源名稱。

  上面的例子中,http為協議辨識符,而//java.sun.com/為資源名稱。

  協議辨識符說明被使用來擷取資源的協議的名稱。樣本使用超文字傳輸通訊協定 (HTTP)(HTTP),它用在超文字文件服務中使用。HTTP只是被用來訪問網上不同類型資源的多種不同協議之一。其它的協議還包括檔案傳輸通訊協定(FTP)、gopher、檔案(file)和新聞(news)。

  資源名稱是資源的完整地址。資源名稱的格式完全依賴於使用的協議,但對於大多數格式而言,資源名稱包括下面組件的一種或多種:

  (1) 宿主名稱:資源所處的機器的名稱。

  (2) 檔案名稱:機器上檔案的路徑。

  (3) 連接埠號碼:串連的連接埠號碼(一般為可選項)。

  (4) 引用:對於資源內部一個有名串連(anchor)的一個引用;它常常指代一個檔案內的特定位置(一般為可選項)。

  大多數情況下,宿主名稱和檔案名稱是必須的,而連接埠號碼以及引用則是可選的。上面的樣本中java.sun.com為宿主名稱,冒號後的第一個斜線’/’是檔案/index.html的簡寫。

  在構建任何URL的時候,都應該將協議辨識符放在首位,後面緊跟冒號’:’,然後才是資源名稱,即:

  protocolID:resourceName

  在類組java.net中包含一個類URL,Java程式使用它代表一個URL地址。Java程式可以構造一個URL對象,開啟對它的一個串連,然後在這個串連中讀入和寫出。

  三、建立一個URL

  在Java程式中,可以建立一個URL對象以表示一個URL地址。URL對象總是指向一個絕對的URL,但它可以由一個絕對的URL、一個相對的URL或URL組件構造而來。

  建立一個URL對象的最簡單的方法就是從一個表示URL地址的“可閱讀”形式的字串建立。

  在Java中,可以使用上述文字的字串建立一個URL對象:

  URL gamelan=new URL(http://www.linuxaid.com.cn/)

  這種方法建立的URL對象表示一個絕對的URL。一個絕對的URL包含了到達資源所需的所有資訊。另外,還可以由一個相對的URL地址建立URL對象。

  (1) 相對URL

  一個相對URL只包含到達對於另一個URL(或處於另一個URL上下文之中)的資源的足夠資訊。

  在HTML檔案中常常使用相對的URL指定資源的位置。如有兩個檔案1.html、2.html和3.html,並且它們在同一個目錄下面,那麼在1.html中如果需要調用2.html和3.html則必須寫入:

  My Story

  Picture of My Pets

  這些URL均為相對的URL,即:這些URL相對於包含它們的檔案1.html。

  在Java中中,可以由一個相對的URL指定建立一個URL對象。例如,假設程式已經為http://www.linuxaid.com.cn/建立了一個URL對象,而且已經知道該網站的一個檔案的名稱為linuxaid.animation.html,則就可以在初始的linuxaid URL上下文中,通過簡單地指定檔案名稱,為linuxaid網站的這個檔案建立URL:

  URL linuxaid = new URL(http://www.javaworld.com/);

  URL linuxaidanimation = new URL(linuxaid,”linuxaid.animation.html”);

  上面的代碼使用用了類URL的另一種形式的構造過程,它允許你由一個URL對象(基本URL)和一個相對的URL建立一個對象。

  這個構造過程也可以用來建立對一個檔案中的有名串連(引用)的URL對象。例如,假設檔案“linuxaid.animation.html”中包含一個有名串連BOTTOM,它在檔案的底部,

  則可以使用相對URL構造過程建立一個URL對象(在下面的語句中BOTTOM前的字元#是必須的):

  URL linuxaidAnimationBottom=new URL(linuxaid,”#BOTTOM”);

  這種URL構造過程的一般形式為:

  URL(URL baseURL,String relativeURL)

  其中,第一個參數是一個URL對象,指定新的URL的基址,第二個參數為一個String對象,是對相對於基址的資源名稱的描述。如果baseURL為null,那麼這個構造過程就將relativeURL視為一個絕對的URL指定。但如果relativeURL是一個絕對的URL指定,那麼構造過程將忽略baseURL。

  (2)其它的URL構造過程

  除前面介紹的類URL的構造過程外,類URL還提供了另外兩個構造過程。當你使用URL的時候,例如HTTP的URL,它的資源名稱部分包含宿主名稱、檔案名稱、連接埠號碼和

  引用等組件,這些構造過程就很有用了。如果不清楚包含完整URL的String對象,只要知道URL的不同組件,使用這兩個構造過程就顯得非常方便。

  如果需要設計一個網路程式,讓使用者使用滑鼠選擇協議、宿主名稱、連接埠號碼和檔案名稱,則可以由這些組件構造一個URL。類URL提供了用協議、宿主名稱和檔案名稱建立一個URL的構造過程。下面的代碼就建立了一個指向linuxaid網站的linuxaid.animation.html檔案的URL:

  URL linuxaid = new URL(“http”,”www.linuxaid.com.cn”,”/linuxaid.animation.html”);

  該語句和URL linuxaid=URL(http://www.linuxaid.com.cn/linuxaid.animation.html);是等價的。其中,第一個參數為協議,第二個參數為宿主名稱,最後一個為檔案的路徑名。

  注意,檔案名稱的開頭為一個斜線’/’,說明檔案名稱相對於宿主的根目錄。

  類URL的另一個構造過程還在參數列表中添加了連接埠號碼,例如:

  URL linuxaid = new URL(“http”,www.linuxaid.com,80,”/linuxaid.animation.html”);

  其中,80是連接埠號碼,別的參數同前。該語句建立了如下的一個URL對象:

  http://www.linunaid.com.cn:80/linunxaid.animation.html

  如果使用這些過程建立一個URL對象,就可以通過使用URL的過程toString()或過程toExternalForm()得到一個包含完整URL地址的String對象。

  (2) 異常MalformedURLException

  在類URL的構造過程的兩個版本中,當傳遞給它們的參數指向一個空的或不知道的協議時,它們都拋出一個MalformedURLException異常。如果希望捕捉和處理這個異常,只要將URL的構造過程語句放在一個try/catch中即可。例如:

  try{

  URL url=new URL(….);

  }catch (MalformedURLException e){

  //異常處理代碼

  }

  四、分析一個URL

  類URL提供一些查詢URL對象的過程,可以用它們擷取一個有效URL對象所包含的協議、宿主名稱、連接埠號碼和檔案名稱。下面是這些過程的功能描述:

  (1) getProtocol( ),返回URL的協議辨識符組件。

  (2) getHost(),返回URL的宿主名稱組件。

  (3) getPort(),返回URL的連接埠號碼組件;如果連接埠沒有設定,返回-1;

  (4) getFile(),返回URL的檔案名稱組件。

  (5) getRef(),返回URL的引用組件。

  請注意;並非所有的URL地址都包含這些組件。類URL提供這些過程的原因是HTTP URL包含這些組件,而且它們可能是最常使用的URL。類URL在某種程式是以HTTP為中心的。

  可以使用這些getXXX()過程擷取關於URL的資訊,它們與建立URL對象的構造過程無關。

  下面給出一個樣本程式ParseURL,它由一個指定URL的字串建立了一個URL對象,然後使用URL對象的存取過程分析URL;

  import java.net.*;

  class ParseURL{

  public static void main(String[] args){

  URL url = null;

  try{

  url = new URL(http://www.ncsa.uiuc.edu:8080/demoweb/urlprimer.html#INSTALL);

  System.out.println(“protocol = “+ url.getProtocol());

  System.out.println(“host =”+url.getHost());

  System.out.println(“filename =”+url.getFile());

  System.out.println(“port=”+url.getPort());

  System.out.println(“ref=”+url.getRef());

  }catch (MalformedURLException e){

  System.err.println(“MalformedURLException:”+e);

  }

  }

  }

  下面是程式執行的結果:

  protocol=http

  host=www.ncsa.uinc.edu

  filename=/demoweb/url-primer.html

  port=8080

  ref=INSTALL

  使用過程getRef()應當注意:在JDK1.02以前的版本中,過程getRef()僅對以下兩個構造過程建立的URL有效:

  URL(String absoluteURLSpecification);

  URL (URL baseURL,String relativeURLSpecification);

  例如,假設你使用下面的語句建立了一個URL:

  URL linuxaid=new URL(“http://www.linuxaid.com.cn/”);

  URL linuxaidAnimationBottom=new URL(gamelan,”linuxaid.animation.html#BOTTOM”);

  當你對linuxaidAnimationBottom調用過程getRef()時,它正確地返回”BOTTOM”。但你如果使用下面的語句建立一個指向同一資源的URL:

  URL linuxaidAnimationBottom = new URL(“http”,”www.linuxaid.com.cn”,”linuxaid.animation.html#BOTTOM”);

  當調用過程getRef()從上面語句所建立的linuxaidAnimationbottom中擷取資訊時,getRef()返回null,而不能返回正確值“BOTTOM”。

  五、直接從一個URL讀入

  在成功建立了一個URL以後,就可以調用URL的過程openStream()以擷取一個流,並從這個流中讀入URL的內容。過程openStream()返回一個InputStream對象,因此,可以使用

  一般的InputStream過程讀入。本書第2.9節描述了Java開發環境提供的I/O類及其使用方法。

  從一個URL中讀入就如同從一個輸入資料流中讀入一樣容易。下面的Java程式openStreamTest使用過程openStream()得到URL http://www.javaworld.com/ 上的一個輸入資料流,然後從這個

  輸入資料流中讀入URL的內容,並顯示在螢幕上。

  Import java.net.*;

  Import java.io.*;

  Class OpenStreamTest{

  Public static void main(String[] args){

  Try{

  URL url = new URL(http://www.javaworld.com/);

  DataInputStream dis = new DataInputStream(url.openStream());

  String str;

  While((str=dis.readLine())!=null)

  System.out.println(str);

  Dis.close();

  }catch (MalformedURLException e){

  System.err..println(“MalformedURLException:”+e);

  }catch (IOException e){

  System.err.pintln(“IOException:”+e);

  }

  }

  }

  }

  當運行程式時,就會看到在http://www.javaworld.com/的HTML檔案中的HTML命令以及常值內容滾動顯示在視窗中。或者,你可能看到:

  IOException:java.net.UnknownHostException:www.javaworld.com

  上面這條資訊說明:可能需要對你的系統進行必要的設定,才能使你的程式能夠找到www.javaworld.com伺服器。

  除了上面提到的過程openStream(),類URL還提供了過程getContent(),它可以直接擷取URL指向的資源。下面給出的程式Fetch展示了使用過程getContent()具體方法。

  import java.net.*;

  import java.awt.*;

  import java.io.*;

  import java.awt.image.*;

  public class Fetch{

  public static String fetch(String addr)

  throws MalformedURLException,IOException{

  URL url = new URL(addr);

  Return (String)(url.getContent());

  }

  public static Image fetchImage(String addr,Component comp)

  throws MalformedURLException,IOException{

  URL url = new URL(addr);

  Return comp.createImage((ImageProducer)(url.getContent()));

  }

  public static void main(String[] args)

  throws MalformedURLException,IOException{

  System.out.println(fetch(args[0]));

  }

  }

  Fetch只能下載普通的文字檔(非HTML檔案或其它類型的文字檔)。在類Fetch中還包括了一個過程fetchImage(),它可以下載GIF或其它常見格式的映像,你可以使

  用下面給出的程式FetchImageTest來進行測試。

  import java.awt.*;

  import java.awt.image.*;

  import java.net.*;

  import java.io.*;

  public class FetchImageTest extends Frame{

  private Image img;

  public void paint(Graphics g){

  g.drawImage(img,0,0,this);

  }

  public static void main(String)[] args)

  throws MalformedURLException,IOException{

  FetchImageTest window = new FetchImageTest();

  window.img = Fetch.fetchImage(args[0],window);

  window.resize(300,300);

  window.show();

  }

  }

  在編譯完該程式之後,你可以採用以下命令運行該程式:

  java FetchImageTest http://www.xp163.com/Files/BeyondPic/jeeves.sm.gif

  請注意:普通文字檔和圖象檔案的下載依賴於Java實現的內部“內容處理器”。在JDK環境中,這兩個樣本程式均可以正常工作,但並不意味著在其它的Java實現下也能工作,對於那些沒有包含合適的內容處理器的Java實現而言,這兩個程式就不能工作。如果程式遇到了不支援的內容類型,程式將拋出異常並退出。

  這兩個程式只是為了說明過程getContent()的用法。一般情況下,這不是通過網路載入文本或圖象的最好途徑,例如,類Applet的過程loadImage()就是一個更好的選擇。

  六、串連至一個URL

  在成功地建立了一個URL以後,就可以調用URL的openConnection()過程串連至該URL。當串連至一個URL之後,就通過電腦網路在Java程式與URL之間建立了一個通訊連結。

  過程openConnection()建立一個新的URLConnection對象(如果不存在一個合適的),對它進行初始化,串連至URL,並返回URLConnection對象。如果這個過程中某個環節出了問題(例如:伺服器已關閉了),過程openConnetion()將拋出一個IOException異常。

  如果已經成功地串連至希望的URL,就能夠使用URLConnection對象進行對串連的讀寫操作,或者查詢關於它的內容的資訊。下面會介紹如何對一個URLconnection進行讀寫操作。下面給出的程式GetURLInfo首先串連至URLhttp://www.javaworld.com,然後查詢URLConnectction對象的有關資訊。

  import java.net.*;

  import.java.io.*;

  import java.util.*;

  public class GetURLInfo{

  public static void printInfo(URLConnection uc){

  try{

  System.out.println(uc.getURL().toExternalForm()+”:”);

  System.out.println(“ Content Type:” +uc.getContentType());

  System.out.println(“Content Length:”+uc.getContentLength());

  System.out.println(“Last Modified:”+new Date(uc.getLastModified()));

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.