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 閱讀(208)
評論(0) 編輯 收藏