close

【程式語言】Java的網路知識

1 從網路上載入APPLE(小應用程式)
現在的大多數瀏覽器都不約而同地對Java進行支援。在HTML語言中,在.html文件的任何的位置上有一個特殊標記 。這句話就是對小應用程式的引用。小應用程
序沒有受到地域的限制,它可以在本地,也可以在Internet上的任何一個地方。其位置對於用戶來講是透明的。而對於瀏覽器來講,其位置在 中被讀出,然後進
行定位小應用程式,並運行它。如果小應用程式位於遠端電腦上,那麽瀏覽器就必須小載它,然後才可運行。
2 URL載入圖像
首先,必須先介紹URL。它表示一個通過資源定位器(Uniform Resource Locator),是網路上某些資源的地址。Java程式可以使用一個URL來引用或連接網路資源。如:
如果需要從遠端載入一張圖時,Java程式必須先創建一個URL,以包含圖像的位址。
URLJava程式裏高級別的交互功能。
二、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只是被用來訪問網上不同類型資源的多種不同
協定之一。其他的協定還包括文件傳輸協定(FTP)、gopher、文件(file)和新聞(news)。
資源名稱是資源的完整地址。資源名稱的格式完全依賴於使用的協定,但對於大多數格式而言,資源名稱包括下面元件的一種或多種:
1 宿主名稱:資源所處的機器的名稱。
2 檔案名:機器上文件的路徑。
3 埠號:連接的埠號(一般爲可選項)。
4 引用:對於資源內部一個有名連接(anchor)的一個引用;它常常指代一個文件內的特定位置(一般爲可選項)。
大多數情況下,宿主名稱和檔案名是必須的,而埠號以及引用則是可選的。上面的示例中java.sun.com爲宿主名稱,冒號後的第一個斜線’/’是文件/index.html的簡寫。
在構建任何URL的時候,都應該將協定辨識符放在首位,後面緊跟冒號’:’,然後才是資源名稱,即:
protocolID:resourceName
在類組java.net中包含一個類URLJava程式使用它代表一個URL地址。Java程式可以構造一個URL物件,打開對它的一個連接,然後在這個連接中讀入和寫出。
三、創建一個URL
Java程式中,可以創建一個URL物件以表示一個URL位址。URL物件總是指向一個絕對的URL,但它可以由一個絕對的URL、一個相對的URLURL元件構造而來。
創建一個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.html2.html3.html,並且它們在同一個目錄下面,那麽在1.html中如果需要調用2.html3.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構造過程的一般形式爲:
URLURL baseURL,String relativeURL
其中,第一個參數是一個URL物件,指定新的URL的基址,第二個參數爲一個String物件,是對相對于基址的資源名稱的描述。如果baseURLnull,那麽這個構造過程就
relativeURL視爲一個絕對的URL指定。但如果relativeURL是一個絕對的URL指定,那麽構造過程將忽略baseURL
(2)其他的URL構造過程
除前面介紹的類URL的構造過程外,URL還提供了另外兩個構造過程。當你使用URL的時候,例如HTTPURL,它的資源名稱部分包含宿主名稱、檔案名稱、埠號和
引用等元件,這些構造過程就很有用了。如果不清楚包含完整URLString物件,只要知道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有效:
URLString 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.javaworld.com/jw-10-1996/jeeves.sm.gif
請注意:普通文字檔案和圖像文件的下載依賴於Java實現的內部內容處理器。在JDK環境中,這兩個示例程式均可以正常工作,但並不意味著在其他的Java實現下也能工
作,對於那些沒有包含合適的內容處理器的Java實現而言,這兩個程式就不能工作。如果程式遇到了不支援的內容類型,程式將抛出異常並退出。
這兩個程式只是爲了說明過程getContent()的用法。一般情況下,這不是通過網路載入文本或圖像的最好途徑,例如,類Applet的過程loadImage()就是一個更好的選擇。
六、連接至一個URL
在成功地創建了一個URL以後,就可以調用URLopenConnection()過程連接至該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()));

arrow
arrow
    文章標籤
    Java
    全站熱搜
    創作者介紹
    創作者 金好康-好康資訊 的頭像
    金好康-好康資訊

    金好康-好康資訊

    金好康-好康資訊 發表在 痞客邦 留言(0) 人氣()