1. 程式人生 > >基於URL的高層次Java網絡編程

基於URL的高層次Java網絡編程

內部 exc sof shtml connect buffer throw 從服務器 game

  • 一致資源定位器URL

URL(Uniform Resource Locator)是一致資源定位器的簡稱,它表示Internet上某一資源的地址。通過URL我們可以訪問Internet上的各種網絡資源,比如最常見的WWW,FTP站點。瀏覽器通過解析給定的URL可以在網絡上查找相應的文件或其他資源。

  • URL的組成

protocol://resourceName

協議名(protocol)指明獲取資源所使用的傳輸協議,如http、ftp、gopher、file等,資源名(resourceName)則應該是資源的完整地址,包括主機名、端口號、文件名或文件內部的一個引用。例如:


http://www.sun.com/ 協議名://主機名

http://home.netscape.com/home/welcome.html 協議名://機器名+文件名

http://www.gamelan.com:80/Gamelan/network.html#BOTTOM 協議名://機器名+端口號+文件名+內部引用。
  • 創建一個URL

為了表示URL, java.net中實現了類URL。我們可以通過下面的構造方法來初始化一個URL對象:

(1) public URL (String spec);

通過一個表示URL地址的字符串可以構造一個URL對象。


URL urlBase=new URL("http://www. 263.net/")

(2) public URL(URL context, String spec);

通過基URL和相對URL構造一個URL對象。


URL net263=new URL ("http://www.263.net/");

URL index263=new URL(net263, "index.html")

(3) public URL(String protocol, String host, String file);


new URL("http", "www.gamelan.com", "/pages/Gamelan.net. html");

(4) public URL(String protocol, String host, int port, String file);


URL gamelan=new URL("http", "www.gamelan.com", 80, "Pages/Gamelan.network.html");

註意:類URL的構造方法都聲明拋棄非運行時例外(MalformedURLException),因此生成URL對象時,我們必須要對這一例外進行處理,通常是用try-catch語句進行捕獲。格式如下:


    try{

       URL myURL= new URL(…)

  }catch (MalformedURLException e){

  …  }
  • 解析一個URL

一個URL對象生成後,其屬性是不能被改變的,但是我們可以通過類URL所提供的方法來獲取這些屬性:


public String getProtocol() 獲取該URL的協議名。

public String getHost() 獲取該URL的主機名。

public int getPort() 獲取該URL的端口號,如果沒有設置端口,返回-1。

public String getFile() 獲取該URL的文件名。

public String getRef() 獲取該URL在文件中的相對位置。

public String getQuery() 獲取該URL的查詢信息。

public String getPath() 獲取該URL的路徑。

public String getAuthority() 獲取該URL的權限信息。

public String getUserInfo() 獲得使用者的信息。

public String getRef() 獲得該URL的錨。
  • 從URL讀取WWW網絡資源

當我們得到一個URL對象後,就可以通過它讀取指定的WWW資源。這時我們將使用URL的方法openStream(),其定義為:


InputStream openStream();

方法openSteam()與指定的URL建立連接並返回InputStream類的對象以從這一連接中讀取數據。


public class URLReader {

  public static void main(String[] args) throws Exception { 

                      //聲明拋出所有例外

    URL tirc = new URL("http://www.tirc1.cs.tsinghua.edu.cn/"); 

                      //構建一URL對象

    BufferedReader in = new BufferedReader(new InputStreamReader(tirc.openStream()));

    //使用openStream得到一輸入流並由此構造一個BufferedReader對象

    String inputLine;

    while ((inputLine = in.readLine()) != null) 

                 //從輸入流不斷的讀數據,直到讀完為止

       System.out.println(inputLine); //把讀入的數據打印到屏幕上

    in.close(); //關閉輸入流

  }

}
  • 通過URLConnetction連接WWW

通過URL的方法openStream(),我們只能從網絡上讀取數據,如果我們同時還想輸出數據,例如向服務器端的CGI程序發送一些數據,我們必須先與URL建立連接,然後才能對其進行讀寫,這時就要用到類URLConnection了。CGI是公共網關接口(Common Gateway Interface)的簡稱,它是用戶瀏覽器和服務器端的應用程序進行連接的接口,有關CGI程序設計,請讀者參考有關書籍。

類URLConnection也在包java.net中定義,它表示Java程序和URL在網絡上的通信連接。當與一個URL建立連接時,首先要在一個URL對象上通過方法openConnection()生成對應的URLConnection對象。例如下面的程序段首先生成一個指向地址http://edu.chinaren.com/index.shtml的對象,然後用openConnection()打開該URL對象上的一個連接,返回一個URLConnection對象。如果連接過程失敗,將產生IOException.


  Try{

    URL netchinaren = new URL ("http://edu.chinaren.com/index.shtml");

    URLConnectonn tc = netchinaren.openConnection();

  }catch(MalformedURLException e){ //創建URL()對象失敗

  …

  }catch (IOException e){ //openConnection()失敗

  …

  }

類URLConnection提供了很多方法來設置或獲取連接參數,程序設計時最常使用的是getInputStream()和getOurputStream(),其定義為:


InputSteram getInputSteram();

OutputSteram getOutputStream();

通過返回的輸入/輸出流我們可以與遠程對象進行通信。看下面的例子:


  URL url =new URL ("http://www.javasoft.com/cgi-bin/backwards"); 

  //創建一URL對象

  URLConnectin con=url.openConnection(); 

  //由URL對象獲取URLConnection對象

  DataInputStream dis=new DataInputStream (con.getInputSteam()); 

  //由URLConnection獲取輸入流,並構造DataInputStream對象

  PrintStream ps=new PrintSteam(con.getOutupSteam());

  //由URLConnection獲取輸出流,並構造PrintStream對象

  String line=dis.readLine(); //從服務器讀入一行

  ps.println("client…"); //向服務器寫出字符串 "client…"

其中backwards為服務器端的CGI程序。實際上,類URL的方法openSteam()是通過URLConnection來實現的。它等價於


openConnection().getInputStream();

基於URL的網絡編程在底層其實還是基於下面要講的Socket接口的。WWW,FTP等標準化的網絡服務都是基於TCP協議的,所以本質上講URL編程也是基於TCP的一種應用。

基於URL的高層次Java網絡編程