隨筆-71  評論-4  文章-0  trackbacks-0
          Java的 網絡 功能與編程
          徐迎曉
          (上海大學計算中心25#)
          ???????????????????????
          摘??要:Java語言是Internet上最熱門的編程語言,本文針對

          ???????Java的
          網絡 功能,對Java從 網絡 上獲取圖象、聲音、

          ???????HTML文檔及文本文件等編程方法作了初步的介紹,同

          ???????時介紹了動態獲取
          網絡 上資源的方法作了介紹。文中

          ???????提供了大量簡明易懂的實例。

          關鍵詞:Java;Internet;
          網絡



          ????Java語言是Internet上新興的編程語言,對Java的特性以及基

          本的編程方法已有很多文章作過介紹。但是,廣大Java愛好者更希望

          了解Java更深一步的編程方法,本文就Java的
          網絡 功能及其編程方法

          作一初步的介紹。

          ????為了方便初次接觸Java的讀者,本文先就Java編程的一些常識

          作簡單介紹。



          ????一、Java編程簡介



          ????1. 編程環境:



          ????對于大部分讀者,以下的配置是較為經濟的一種選擇:

          操作系統 Win95

          編譯軟件 JDK1.01

          瀏覽軟件 Netscape2.0以上(32位)



          ????2. 編程方法:



          ????先用文本編輯器如Edit、NotePad等輸入Java程序,以.java為

          文件名后綴存盤。

          ????再執行命令行:“Javac 文件名”來編譯Java程序。編譯后生成

          后綴為.class的字節碼文件。

          ????最后,如果是Java Applitcation,則執行命令行:“Java 字

          節碼文件名”來運行Java程序。

          ????如果是Java Applet,則用文本編輯器輸入調用該Java Applet

          的HTML 文檔, 以 .htm 為文件名后綴存盤。 再執行命令行:

          “appletviewer HTML文件名”來運行Java Applet。或用Netscape

          打開該HTML文檔。



          ????3. 關于本文中程序的說明



          ????為了使程序能夠最簡潔地體現其所代表的編程方法,本文中的程

          序一般采用最簡單的形式,省略了線程等內容。因此,本文的程序不

          是“好”的程序,但最容易為初學者理解。

          ????本文的所有程序經編譯后,生成的字節碼文件及對應的HTML文檔

          已上載到http://www.shu.edu.cn/~xyx/test/jvnet, 均可正確

          運行。連入Internet的讀者可用瀏覽器打開該地址,查看運行效果。

          ????連入Internet的讀者也可以在本地硬盤輸入并編譯本文的程序,

          用Netscape的File/Open File菜單打開HTML文檔,體會編程方法并

          查看運行效果。如果讀者想將Java Applet 放到自己的主機上或其他

          ftp服務器上,在Netscape中用http協議或ftp協議調用,出于安全

          性限制,應作如下修改:

          ???如果讀者在某個WWW主機上有帳號,可以做個人Homepage(一般

          在用戶根目錄創建WWW或public_html目錄即可,Homepage的地址為

          http://HostName/~個人帳號),可將本文程序中對應的

          http://www.shu.edu.cn/~xyx/部分修改為讀者自己的Web結點地址,

          然后將編譯后生成的字節碼文件及對應的HTML文檔上載到自己的結點上。

          ????如果讀者的計算機連入了Internet,也可以找一個可以上載的

          ftp結點,如:ftp://ftp.shnet.edu.cn/incoming,將本文程序中

          對應的http://www.shu.edu.cn/~xyx/部分修改為ftp結點的地址,

          將編譯后生成的字節碼文件及對應的HTML文檔上載到該結點上,以查

          看運行效果。

          ????如果讀者的計算機沒有聯網,也可以在單機上運行Web 服務軟

          件如Webstar for Win95,將本文程序中對應的http: //www. shu

          .edu.cn/~xyx/部分修改為“http://本地IP地址”的形式,來模擬

          網絡 編程。



          ????二、Java
          網絡 功能及獲取 網絡 上資源的一般步驟



          ????Java程序可以獲取
          網絡 上結點的圖象、聲音、HTML文檔及文本

          等資源,并可以對獲得的資源進行處理。例如Java程序可以每隔一

          定時間讀取某結點提供的最新數據,并以圖表的形式顯示出來。

          ????在編程處理上,一般先生成一個URL類型的對象,然后用 Java

          中相應的方法(method)獲取該對象所代表的資源。下面分別介紹

          Java
          網絡 功能的幾個例子,并由此介紹幾種不同的編程方法。



          ????三、從
          網絡 上獲取圖象



          ????Java Applet可以直接從
          網絡 上結點獲取圖象并顯示出來。 為

          了了解其編程方法和從本地顯示圖象的編程有何不同,我們先不考慮

          網絡 功能,來看一個簡單的圖象顯示的例子:



          ●程序1

          import java.applet.*;

          import java.awt.*;

          public class imag0 extends Applet{

          ??Image image;

          ??public void init() {

          image=getImage(getDocumentBase(),"test.gif");

          ??}

          ??public void paint(Graphics g) {

          ?????g.drawImage(image, 0, 0,this);

          ??}

          }



          ????這是一個最簡單的獲取并顯示圖象的例子, 在該例中, 先用

          getImage(getDocumentBase(),圖象文件名)從HTML文檔所在位置調

          用圖象test.gif,并由此生成一個Image類型的對象image, 然后用

          drawImage(image, 0, 0,this)在屏幕上將圖象顯示出來。

          ????如果想從
          網絡 上其他結點獲取圖象,關鍵是創建對應于 網絡

          其他結點的Image類型的對象,一旦獲得Image類型的對象獲得了,

          便可以對其進行任何可能的圖象操作。

          ????Java提供了如下方法可以創建對應于其他結點的圖象:

          getImage(new URL(字符串))

          ????其使用格式可有兩種:



          ????String??url = "結點URL";

          ????Image image;

          ????try {

          ??????image = getImage(new URL(url));

          ????}

          catch(Exception e){

          System.out.println("Can't open the URL ");

          ????}







          URL imgur=null;

          Image image;

          try {

          ????????????imgur=new URL("結點URL ");

          ?????}

          ?????catch (MalformedURLException e) {

          ????????????System.out.println("Can't open the URL ");

          ?????}

          ?????image=getImage(imgur);



          ????前一種格式用“new URL(url)”生成 URL 對象, 并直接作為

          getImage的參數,后一種格式先用“new URL(url)”生成一個 URL

          對象,再傳給getImage。兩種格式本質上是一樣的。兩種格式中,

          生成URL對象的部分都包含在



          try{

          獲取URL對象

          ???????????????????????????}

          catch (MalformedURLException e) {

          出錯提示

          ???????????????????????????}

          中。

          ????例如要調用http://www.shu.edu.cn/~xyx/img/shnet.jpg結點

          的圖象,第一種格式完整的程序如下:

          ●程序2

          import java.applet.*;

          import java.net.*;

          import java.awt.*;

          public class imag extends Applet{

          ??Image image;

          ??public void init() {

          ????String??url = "http://www.shu.edu.cn/~xyx/img/shnet.jpg";

          ????try {

          ??????image = getImage(new URL(url));

          ????} catch(Exception e){}

          ??}



          ??public void paint(Graphics g) {

          ?????g.drawImage(image, 0, 0,this);

          ??}

          }



          ????第二種格式完整的程序如下:

          ●程序3

          import java.applet.*;

          import java.net.*;

          import java.awt.*;

          public class imag2 extends Applet{

          ??Image image;

          ??URL imgur=null;

          ??public void init() {

          ?????try {

          ??????imgur=new URL("http://www.shu.edu.cn/~xyx/img/shnet.jpg");

          ?????????}

          ????????catch (MalformedURLException e) {



          ????????????????System.out.println("Can't open the URL ");

          ??????}

          ??????image=getImage(imgur);

          ??}

          ??public void paint(Graphics g) {

          ?????g.drawImage(image, 0, 0,this);

          ??}

          }



          ????將上述兩個程序分別以imag.java和imag2. java 存盤, 執行

          javac imag.java和javac imag2.java,將得到編譯后生成的imag

          .class和imag2.class,最后創建調用這兩個Java Applet的HTML文

          檔,如imag.class對應的HTML文檔可如下:

          < html >

          < head >

          < title >Example < /title >

          < /head >

          < center >

          < applet code=imag.class width=550 height=250 >

          < /applet >

          < /html >



          ????將該HTML文檔存入test.html文件,用Netscape打開, 如果你

          的計算機連入了Internet,便可以看到Java Applet 所顯示的從網

          絡上獲得的圖象了。(對于本文中其他不同的Java Applet, 對應

          的HTML文檔只要修改其中相應的“code=imag.class”即可。)



          ????四、從
          網絡 上獲取聲音



          ????Java從
          網絡 上獲取聲音文件并播放聲音的編程方法有兩類,一

          是利用Java提供的play(URL)及play(URL,String) 直接播放
          網絡

          上的聲音文件,另一類是通過getAudioClip(URL)或getAudioClip

          (URL,String)先從
          網絡 上獲取聲音文件,并生成AudioClip 類型的

          對象,然后對該對象進行操作。

          ????前者的使用格式是:



          String??Audur = "結點URL";

          ????????try {

          ?????play(new URL(Audur));????

          ????????} catch(Exception e){}







          String??Audur = "結點URL";

          ????????try {

          ???????????play(new URL(Audur),聲音文件名);

          ????????} catch(Exception e){}

          ????后者使用的格式是:

          String Audur = "結點URL";

          AudioClip??loopClip;

          ????try {

          ???????????loopClip = getAudioClip(new URL(Audur));

          ????????}

          catch(Exception e){

          System.out.println("Can't open the URL ");

          ??????????????????}







          String Audur = "結點URL";

          ????AudioClip??loopClip;

          ????try {

          ???????????loopClip = getAudioClip(new URL(Audur) ,聲音文件名);

          ????????????????????}

          catch(Exception e){

          System.out.println("Can't open the URL ");

          }



          ????上面的四種格式都是將生成URL對象部分--“new URL(url)”

          直接作為play或getAudioClip的參數;和前面處理圖象的例子一樣,

          也可以先用“new URL(url)”獲取一個URL對象, 再傳給 play 或

          getAudioClip。如對第一種play(URL)的格式, 也可采用如下的編

          程格式:

          URL??Audur =null;

          ????????try {

          ???Audur=new URL("結點URL ");

          ????????} catch(Exception e){

          System.out.println("Can't open the URL ");

          ?????}

          ????play(Audur);

          ????下面對前述四種從
          網絡 上獲取并播放聲音文件的格式各舉一簡單的例子,

          以作編程時參考:

          ?????????????????????????●程序4???格式一

          import java.applet.*;

          import java.awt.*;

          import java.net.*;

          public class sound1 extends Applet



          {???AudioClip??loopClip;

          ????public void paint(Graphics g) {

          ????String??Audur = "http://www.shu.edu.cn/~xyx/java/Animator/audio/bark.au";

          ????????try {

          ?????play(new URL(Audur));????

          ????????} catch(Exception e){}

          ????}

          }



          ?????????????????????????????●程序5???格式二

          import java.applet.*;

          import java.awt.*;

          import java.net.*;

          public class sound2 extends Applet

          {???AudioClip??loopClip;

          ?????public void paint(Graphics g) {

          ????????String??Audur = "http://www.shu.edu.cn/~xyx/java/Animator/audio/";

          ????????try {

          ???????????play(new URL(Audur),"bark.au");

          ????????} catch(Exception e){}

          ????}

          }



          ?????????????????????????????●程序6???格式三

          import java.applet.*;

          import java.awt.*;

          import java.net.*;

          public class sound extends Applet{

          ???AudioClip??loopClip;

          ???public void init() {

          ?????String??Audur = "http://www.shu.edu.cn/~xyx/java/Animator/audio/bark.au";

          ????????try {

          ???????????loopClip = getAudioClip(new URL(Audur));

          ????????} catch(Exception e){}

          ????}



          ???public void paint(Graphics g){

          ????????loopClip.loop();

          ???}

          }



          ●程序7??格式四

          import java.applet.*;

          import java.awt.*;

          import java.net.*;

          public class sound0 extends Applet{

          ???AudioClip??loopClip;

          ???URL auur;

          ???public void init() {

          ?????try {

          ????????????auur=new URL("http://www.shu.edu.cn/~xyx/java/Animator/audio/");

          ??????}

          ??????catch (MalformedURLException e) {

          ????????????????System.out.println("Can't open the URL ");

          ??????}

          ??????loopClip = getAudioClip(auur,"bark.au");



          ????}



          ???public void paint(Graphics g){

          ????????loopClip.loop();

          ???}

          }



          ????五、顯示網絡上其他HTML文檔



          ????利用Java提供的getAppletContext().showDocument(URL)可以

          顯示其他結點的HTML文檔,同前面的顯示網絡上其他結點的圖象,

          有兩種格式,下面各舉一例:

          ??????????????????????●程序8???格式一

          import java.applet.*;

          import java.awt.*;

          import java.net.*;

          public class showdoc extends Applet

          {????

          ????URL docur= null;

          ????public void paint(Graphics g) {

          ??????try {

          ????????????docur=new URL("http://www.shu.edu.cn/~xyx/doc/manhua.html");????????

          ??????}

          ??????catch (MalformedURLException e) {

          ????????????????System.out.println("Can't open the URL ");

          ??????}

          ??????if (docur != null) {

          ????????????????????getAppletContext().showDocument(docur,"_blank");

          ??????}???

          ????}

          }



          ??????????????????????????●程序9 格式二

          import java.applet.*;

          import java.awt.*;

          import java.net.*;

          public class showdoc2 extends Applet

          {????

          ???URL docur= null;

          ???public void paint(Graphics g) {

          ??????try {

          getAppletContext().showDocument(new URL("http://www.shu.edu.cn/

          ~xyx/doc/manhua.html"));???????

          ??????}

          ??????catch (MalformedURLException e) {

          ????????????????System.out.println("Can't open the URL ");

          ??????}???

          ???}

          }



          ?????六、讀取網絡上文件內容



          ?????前述的網絡功能只是顯示或播放網絡上結點的圖象、 聲音及

          HTML文檔,并沒有對其內容進行處理。事實上,Java還可讀取網絡

          上文件的內容,并對其內容進行處理。

          ????讀取網絡上文件內容的步驟可如下:

          ????1. 創建一個URL類型的對象

          ????如:

          ????String url = "ftp://202.120.127.218/incoming/test/readtxt.html";

          URL fileur;

          ????????try {

          fileur = new URL(url); }

          ????????catch ( MalformedURLException e) {

          ???????????????System.out.println("Can't get URL: " );

          ????????}

          ????2. 利用URL類的openStream(),獲得對應的InputStream類的對象

          ????如:

          InputStream filecon = fileur.openStream();

          ????3. 將InputStream對象轉化為DataInputStream類的對象

          ????如:

          ????DataInputStream filedata = new DataInputStream(filecon);

          ????4. 讀取內容

          ????如對前面的filedata,可用filedata.readLine() 一行一行讀

          取內容,或用filedata.readchar一個字符一個字符讀取內容。 對

          讀取到的內容,可由Java Applet進行各種處理, 并將處理結果用

          各種方式顯示出來。

          ????下面的例子是讀取 http://www.shu.edu.cn/~xyx/doc/manhua.html

          文件內容的例子,為簡潔起見,該例中只將文件的內容逐行讀出,

          并在文本區顯示出來。

          ●程序10

          import java.io.*;

          import java.net.*;

          import java.awt.*;

          import java.applet.*;

          public class showfile extends Applet{

          ?????URL fileur;

          ?????TextArea showarea = new TextArea("Please wait a while for get

          text",10,70);

          ?????public void init() {

          ????????String url = "http://www.shu.edu.cn/~xyx/doc/manhua.html";

          ????????try { fileur = new URL(url); }

          ????????catch ( MalformedURLException e) {

          ???????????????System.out.println("Can't get URL: " );

          ????????}

          ????????add(showarea);

          }



          ????public void paint(Graphics g) {

          ????????InputStream filecon = null;

          ????????DataInputStream filedata = null;

          ????????String fileline;

          try {

          ????????????????filecon = fileur.openStream();

          ????????????????filedata = new DataInputStream(filecon);

          ????????????????while ((fileline = filedata.readLine()) != null) {

          ????????????????????????showarea.appendText(fileline+"\n");

          }

          }

          catch (IOException e) {

          ????????????????System.out.println("Error in I/O:" + e.getMessage());

          }

          ???}

          }



          ????七、動態使用網絡上資源

          ????在前面介紹的例子的基礎上,可以動態地利用網絡上的資源。

          其方法是編制一個線程,每隔一定時間自動到相應結點讀取最新的

          內容。本文對線程的編制不再展開,讀者可參考有關文章或直接套

          用下面的例子。

          ????例如對上例中讀取http://www.shu.edu.cn/~xyx/doc/manhua

          .html文件內容的例子,加入線程后如下所示。該例子每隔5秒更新

          一次數據。如果http://www.shu.edu.cn/~xyx/doc/manhua.html中

          存放的是一些變化較快的信息如股市行情等,并有程序隨時動態地

          更新其內容,則在Web中加入這種Java Applet,可以讓流覽者得到

          動態的信息。進一步,也可以在程序中對數據進行處理,并用圖形

          方式顯示處理結果。例如將各時刻的數據繪制成曲線,流覽者可以

          看到動態變化的曲線。

          //程序11

          import java.io.*;

          import java.net.*;

          import java.awt.*;

          import java.applet.*;

          public class dynashow extends java.applet.Applet

          ????implements Runnable {

          ????Thread dthread;

          ????URL fileur;

          TextArea showarea = new TextArea("Wait for a while...",10,70);

          ?????public void init() {

          ????????String url = " http://www.shu.edu.cn/~xyx/doc/manhua.html ";

          ????????try { fileur = new URL(url); }

          ????????catch ( MalformedURLException e) {

          ???????????????System.out.println("Can't get URL: " );

          ????????}

          ????????add(showarea);

          ?????}



          ?????public void start() {

          ????????if (dthread == null)

          ????????{

          ????????????????dthread = new Thread(this);

          ????????????????dthread.start();

          ????????}

          ????}

          ????public void stop() {

          ????????if (dthread != null) {

          ????????????????dthread.stop();

          ????????????????dthread = null;

          ????????}

          ????}



          ????public void run() {

          ????????InputStream filecon = null;

          ????????DataInputStream filedata = null;

          ????????String fileline;

          ????????while(true){

          ????????????try {

          ????????????????filecon = fileur.openStream();

          ????????????????filedata = new DataInputStream(filecon);

          ????????????????while ((fileline = filedata.readLine()) != null) {

          ????????????????????????showarea.appendText(fileline+"\n");

          ????????}

          ????????????}

          ???????????catch (IOException e) {

          ????????????????System.out.println("Error in I/O:" + e.getMessage());

          ???????????}

          ???????????try{

          ????????????????dthread.sleep(5000);

          ???????????}

          ???????????catch (InterruptedException e){}

          ???????????repaint();

          ???????}

          ?????}

          }



          ????八、Java網絡能力的限制



          ????出于安全性考慮,在用netscape瀏覽時,Java Applet 只能和

          其所在的主機建立連接,因此,前面的程序編譯后大部分只能存放

          在http://www.shu.edu.cn/~xyx對應的主機上。存放到其他主機時

          需更改程序中的結點地址。否則瀏覽器將顯示安全出錯。

          ????但對顯示網絡上其他HTML文檔沒有此限制(如程序8、9),讀

          者可以將程序編譯后放到任意WWW服務器或FTP服務器,均可正常運

          行。

          ????此外,當瀏覽器從本地盤打開調用Java Applet的HTML文檔時,

          也不受此限制。因此,本文所有的程序都可存放在本地盤編譯,只

          要用netscape的File/Open File菜單打開,便可正確運行。

          ????對于另一種Java程序--Java Application,也無此限制,例

          如對于讀取網絡上文件內容的程序10,對應的Java Application可

          作如下編程:



          ●程序11

          import java.io.*;

          import java.net.*;

          import java.awt.*;

          class showfile2 {

          ?????public static void main(String args[]){

          ????????InputStream filecon = null;

          ????????DataInputStream filedata = null;

          ????????String fileline;

          ????????String url = "http://www.shu.edu.cn/~xyx/doc/manhua.html";

          ????????URL fileur;

          ????????try {

          ???fileur = new URL(url);

          ????????????????filecon = fileur.openStream();

          ????????????????filedata = new DataInputStream(filecon);

          ????????????????while ((fileline = filedata.readLine()) != null) {

          System.out.println(fileline+"\n");

          }

          }

          catch (IOException e) {

          ????????????????System.out.println("Error in I/O:" + e.getMessage());

          }

          ??}

          }

          ????將其以showfile2.java存盤,用javac showfile2.java編譯后,

          只需執行“java showfile2”便可以在屏幕上打印出

          http://www.shu.edu.cn/~xyx/doc/manhua.html 文件的內容。



          ????九、創建URL對象的方法



          ????在前面的例子中我們統一使用new URL(url字符串)的形式創建

          URL對象。其實,Java提供了四種創建URL對象的形式:

          ????1.new URL(url字符串)????本文中的程序均采用此種格式,如:

          new??URL("http://www.shu.edu.cn/~xyx/doc/manhua.html")

          ????2.new URL(協議,主機名,文件名或路徑)????如程序2中的

          String??url = "http://www.shu.edu.cn/~xyx/img/shnet.jpg";

          image = getImage(new URL(url));部分可改為:

          image = getImage(new URL("http","www.shu.edu.cn","/~xyx /img/shnet.jpg"));

          ????3.new URL(協議,主機名,端口號,文件名或路徑)1

          如:new URL("http","www.shu.edu.cn",80, "/~xyx/doc/manhua.html")

          ????4.new URL(基準url,文件名或路徑)



          ????十、實現網絡功能的其他方法



          ????以上著重介紹了利用Java的URL類實現從網絡上獲取聲音、 圖

          象、HTML文檔及文件數據的編程方法。Java的網絡功能很強大,除

          上面介紹的外,還可以利用URLconnection 類實現更廣泛的網絡

          能,如向WWW 服務器上的 CGI 程序發送信息等; 通過 Socket 及

          ServerSocket類,可以自己編寫客戶軟件及服務軟件,并可以自己

          設計通訊協議。



          〖參考文獻〗

          Laura Lemay,Charles L. Perkins??"Teach Yourself JAVA in 21 Days"

          摘自《Internet世界》
          posted on 2006-03-20 12:28 zjw_albert 閱讀(211) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 祁连县| 阳信县| 抚州市| 贡山| 紫阳县| 康定县| 济南市| 娄底市| 昌江| 垣曲县| 玉溪市| 金昌市| 呼和浩特市| 丰都县| 吐鲁番市| 灯塔市| 缙云县| 通州市| 东乌珠穆沁旗| 乐安县| 东兴市| 栾川县| 溧水县| 元江| 绍兴县| 扎兰屯市| 三都| 伊吾县| 秭归县| 五台县| 水富县| 新余市| 新津县| 历史| 正镶白旗| 五华县| 利川市| 清水县| 出国| 和田县| 延安市|