Java的
網(wǎng)絡(luò)
功能與編程
徐迎曉
(上海大學(xué)計(jì)算中心25#)
???????????????????????
摘??要:Java語言是Internet上最熱門的編程語言,本文針對
???????Java的
網(wǎng)絡(luò)
功能,對Java從
網(wǎng)絡(luò)
上獲取圖象、聲音、
???????HTML文檔及文本文件等編程方法作了初步的介紹,同
???????時(shí)介紹了動(dòng)態(tài)獲取
網(wǎng)絡(luò)
上資源的方法作了介紹。文中
???????提供了大量簡明易懂的實(shí)例。
關(guān)鍵詞:Java;Internet;
網(wǎng)絡(luò)
????Java語言是Internet上新興的編程語言,對Java的特性以及基
本的編程方法已有很多文章作過介紹。但是,廣大Java愛好者更希望
了解Java更深一步的編程方法,本文就Java的
網(wǎng)絡(luò)
功能及其編程方法
作一初步的介紹。
????為了方便初次接觸Java的讀者,本文先就Java編程的一些常識
作簡單介紹。
????一、Java編程簡介
????1. 編程環(huán)境:
????對于大部分讀者,以下的配置是較為經(jīng)濟(jì)的一種選擇:
操作系統(tǒng) Win95
編譯軟件 JDK1.01
瀏覽軟件 Netscape2.0以上(32位)
????2. 編程方法:
????先用文本編輯器如Edit、NotePad等輸入Java程序,以.java為
文件名后綴存盤。
????再執(zhí)行命令行:“Javac 文件名”來編譯Java程序。編譯后生成
后綴為.class的字節(jié)碼文件。
????最后,如果是Java Applitcation,則執(zhí)行命令行:“Java 字
節(jié)碼文件名”來運(yùn)行Java程序。
????如果是Java Applet,則用文本編輯器輸入調(diào)用該Java Applet
的HTML 文檔, 以 .htm 為文件名后綴存盤。 再執(zhí)行命令行:
“appletviewer HTML文件名”來運(yùn)行Java Applet。或用Netscape
打開該HTML文檔。
????3. 關(guān)于本文中程序的說明
????為了使程序能夠最簡潔地體現(xiàn)其所代表的編程方法,本文中的程
序一般采用最簡單的形式,省略了線程等內(nèi)容。因此,本文的程序不
是“好”的程序,但最容易為初學(xué)者理解。
????本文的所有程序經(jīng)編譯后,生成的字節(jié)碼文件及對應(yīng)的HTML文檔
已上載到http://www.shu.edu.cn/~xyx/test/jvnet, 均可正確
運(yùn)行。連入Internet的讀者可用瀏覽器打開該地址,查看運(yùn)行效果。
????連入Internet的讀者也可以在本地硬盤輸入并編譯本文的程序,
用Netscape的File/Open File菜單打開HTML文檔,體會編程方法并
查看運(yùn)行效果。如果讀者想將Java Applet 放到自己的主機(jī)上或其他
ftp服務(wù)器上,在Netscape中用http協(xié)議或ftp協(xié)議調(diào)用,出于安全
性限制,應(yīng)作如下修改:
???如果讀者在某個(gè)WWW主機(jī)上有帳號,可以做個(gè)人Homepage(一般
在用戶根目錄創(chuàng)建WWW或public_html目錄即可,Homepage的地址為
http://HostName/~個(gè)人帳號),可將本文程序中對應(yīng)的
http://www.shu.edu.cn/~xyx/部分修改為讀者自己的Web結(jié)點(diǎn)地址,
然后將編譯后生成的字節(jié)碼文件及對應(yīng)的HTML文檔上載到自己的結(jié)點(diǎn)上。
????如果讀者的計(jì)算機(jī)連入了Internet,也可以找一個(gè)可以上載的
ftp結(jié)點(diǎn),如:ftp://ftp.shnet.edu.cn/incoming,將本文程序中
對應(yīng)的http://www.shu.edu.cn/~xyx/部分修改為ftp結(jié)點(diǎn)的地址,
將編譯后生成的字節(jié)碼文件及對應(yīng)的HTML文檔上載到該結(jié)點(diǎn)上,以查
看運(yùn)行效果。
????如果讀者的計(jì)算機(jī)沒有聯(lián)網(wǎng),也可以在單機(jī)上運(yùn)行Web 服務(wù)軟
件如Webstar for Win95,將本文程序中對應(yīng)的http: //www. shu
.edu.cn/~xyx/部分修改為“http://本地IP地址”的形式,來模擬
網(wǎng)絡(luò)
編程。
????二、Java
網(wǎng)絡(luò)
功能及獲取
網(wǎng)絡(luò)
上資源的一般步驟
????Java程序可以獲取
網(wǎng)絡(luò)
上結(jié)點(diǎn)的圖象、聲音、HTML文檔及文本
等資源,并可以對獲得的資源進(jìn)行處理。例如Java程序可以每隔一
定時(shí)間讀取某結(jié)點(diǎn)提供的最新數(shù)據(jù),并以圖表的形式顯示出來。
????在編程處理上,一般先生成一個(gè)URL類型的對象,然后用 Java
中相應(yīng)的方法(method)獲取該對象所代表的資源。下面分別介紹
Java
網(wǎng)絡(luò)
功能的幾個(gè)例子,并由此介紹幾種不同的編程方法。
????三、從
網(wǎng)絡(luò)
上獲取圖象
????Java Applet可以直接從
網(wǎng)絡(luò)
上結(jié)點(diǎn)獲取圖象并顯示出來。 為
了了解其編程方法和從本地顯示圖象的編程有何不同,我們先不考慮
網(wǎng)絡(luò)
功能,來看一個(gè)簡單的圖象顯示的例子:
●程序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);
??}
}
????這是一個(gè)最簡單的獲取并顯示圖象的例子, 在該例中, 先用
getImage(getDocumentBase(),圖象文件名)從HTML文檔所在位置調(diào)
用圖象test.gif,并由此生成一個(gè)Image類型的對象image, 然后用
drawImage(image, 0, 0,this)在屏幕上將圖象顯示出來。
????如果想從
網(wǎng)絡(luò)
上其他結(jié)點(diǎn)獲取圖象,關(guān)鍵是創(chuàng)建對應(yīng)于
網(wǎng)絡(luò)
上
其他結(jié)點(diǎn)的Image類型的對象,一旦獲得Image類型的對象獲得了,
便可以對其進(jìn)行任何可能的圖象操作。
????Java提供了如下方法可以創(chuàng)建對應(yīng)于其他結(jié)點(diǎn)的圖象:
getImage(new URL(字符串))
????其使用格式可有兩種:
????String??url = "結(jié)點(diǎn)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("結(jié)點(diǎn)URL ");
?????}
?????catch (MalformedURLException e) {
????????????System.out.println("Can't open the URL ");
?????}
?????image=getImage(imgur);
????前一種格式用“new URL(url)”生成 URL 對象, 并直接作為
getImage的參數(shù),后一種格式先用“new URL(url)”生成一個(gè) URL
對象,再傳給getImage。兩種格式本質(zhì)上是一樣的。兩種格式中,
生成URL對象的部分都包含在
try{
獲取URL對象
???????????????????????????}
catch (MalformedURLException e) {
出錯(cuò)提示
???????????????????????????}
中。
????例如要調(diào)用http://www.shu.edu.cn/~xyx/img/shnet.jpg結(jié)點(diǎn)
的圖象,第一種格式完整的程序如下:
●程序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);
??}
}
????將上述兩個(gè)程序分別以imag.java和imag2. java 存盤, 執(zhí)行
javac imag.java和javac imag2.java,將得到編譯后生成的imag
.class和imag2.class,最后創(chuàng)建調(diào)用這兩個(gè)Java Applet的HTML文
檔,如imag.class對應(yīng)的HTML文檔可如下:
< html >
< head >
< title >Example < /title >
< /head >
< center >
< applet code=imag.class width=550 height=250 >
< /applet >
< /html >
????將該HTML文檔存入test.html文件,用Netscape打開, 如果你
的計(jì)算機(jī)連入了Internet,便可以看到Java Applet 所顯示的從網(wǎng)
絡(luò)上獲得的圖象了。(對于本文中其他不同的Java Applet, 對應(yīng)
的HTML文檔只要修改其中相應(yīng)的“code=imag.class”即可。)
????四、從
網(wǎng)絡(luò)
上獲取聲音
????Java從
網(wǎng)絡(luò)
上獲取聲音文件并播放聲音的編程方法有兩類,一
是利用Java提供的play(URL)及play(URL,String) 直接播放
網(wǎng)絡(luò)
上的聲音文件,另一類是通過getAudioClip(URL)或getAudioClip
(URL,String)先從
網(wǎng)絡(luò)
上獲取聲音文件,并生成AudioClip 類型的
對象,然后對該對象進(jìn)行操作。
????前者的使用格式是:
String??Audur = "結(jié)點(diǎn)URL";
????????try {
?????play(new URL(Audur));????
????????} catch(Exception e){}
或
String??Audur = "結(jié)點(diǎn)URL";
????????try {
???????????play(new URL(Audur),聲音文件名);
????????} catch(Exception e){}
????后者使用的格式是:
String Audur = "結(jié)點(diǎn)URL";
AudioClip??loopClip;
????try {
???????????loopClip = getAudioClip(new URL(Audur));
????????}
catch(Exception e){
System.out.println("Can't open the URL ");
??????????????????}
或
String Audur = "結(jié)點(diǎn)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的參數(shù);和前面處理圖象的例子一樣,
也可以先用“new URL(url)”獲取一個(gè)URL對象, 再傳給 play 或
getAudioClip。如對第一種play(URL)的格式, 也可采用如下的編
程格式:
URL??Audur =null;
????????try {
???Audur=new URL("結(jié)點(diǎn)URL ");
????????} catch(Exception e){
System.out.println("Can't open the URL ");
?????}
????play(Audur);
????下面對前述四種從
網(wǎng)絡(luò)
上獲取并播放聲音文件的格式各舉一簡單的例子,
以作編程時(shí)參考:
?????????????????????????●程序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();
???}
}
????五、顯示網(wǎng)絡(luò)上其他HTML文檔
????利用Java提供的getAppletContext().showDocument(URL)可以
顯示其他結(jié)點(diǎn)的HTML文檔,同前面的顯示網(wǎng)絡(luò)上其他結(jié)點(diǎn)的圖象,
有兩種格式,下面各舉一例:
??????????????????????●程序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 ");
??????}???
???}
}
?????六、讀取網(wǎng)絡(luò)上文件內(nèi)容
?????前述的網(wǎng)絡(luò)功能只是顯示或播放網(wǎng)絡(luò)上結(jié)點(diǎn)的圖象、 聲音及
HTML文檔,并沒有對其內(nèi)容進(jìn)行處理。事實(shí)上,Java還可讀取網(wǎng)絡(luò)
上文件的內(nèi)容,并對其內(nèi)容進(jìn)行處理。
????讀取網(wǎng)絡(luò)上文件內(nèi)容的步驟可如下:
????1. 創(chuàng)建一個(gè)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(),獲得對應(yīng)的InputStream類的對象
????如:
InputStream filecon = fileur.openStream();
????3. 將InputStream對象轉(zhuǎn)化為DataInputStream類的對象
????如:
????DataInputStream filedata = new DataInputStream(filecon);
????4. 讀取內(nèi)容
????如對前面的filedata,可用filedata.readLine() 一行一行讀
取內(nèi)容,或用filedata.readchar一個(gè)字符一個(gè)字符讀取內(nèi)容。 對
讀取到的內(nèi)容,可由Java Applet進(jìn)行各種處理, 并將處理結(jié)果用
各種方式顯示出來。
????下面的例子是讀取 http://www.shu.edu.cn/~xyx/doc/manhua.html
文件內(nèi)容的例子,為簡潔起見,該例中只將文件的內(nèi)容逐行讀出,
并在文本區(qū)顯示出來。
●程序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());
}
???}
}
????七、動(dòng)態(tài)使用網(wǎng)絡(luò)上資源
????在前面介紹的例子的基礎(chǔ)上,可以動(dòng)態(tài)地利用網(wǎng)絡(luò)上的資源。
其方法是編制一個(gè)線程,每隔一定時(shí)間自動(dòng)到相應(yīng)結(jié)點(diǎn)讀取最新的
內(nèi)容。本文對線程的編制不再展開,讀者可參考有關(guān)文章或直接套
用下面的例子。
????例如對上例中讀取http://www.shu.edu.cn/~xyx/doc/manhua
.html文件內(nèi)容的例子,加入線程后如下所示。該例子每隔5秒更新
一次數(shù)據(jù)。如果http://www.shu.edu.cn/~xyx/doc/manhua.html中
存放的是一些變化較快的信息如股市行情等,并有程序隨時(shí)動(dòng)態(tài)地
更新其內(nèi)容,則在Web中加入這種Java Applet,可以讓流覽者得到
動(dòng)態(tài)的信息。進(jìn)一步,也可以在程序中對數(shù)據(jù)進(jìn)行處理,并用圖形
方式顯示處理結(jié)果。例如將各時(shí)刻的數(shù)據(jù)繪制成曲線,流覽者可以
看到動(dòng)態(tài)變化的曲線。
//程序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網(wǎng)絡(luò)能力的限制
????出于安全性考慮,在用netscape瀏覽時(shí),Java Applet 只能和
其所在的主機(jī)建立連接,因此,前面的程序編譯后大部分只能存放
在http://www.shu.edu.cn/~xyx對應(yīng)的主機(jī)上。存放到其他主機(jī)時(shí)
需更改程序中的結(jié)點(diǎn)地址。否則瀏覽器將顯示安全出錯(cuò)。
????但對顯示網(wǎng)絡(luò)上其他HTML文檔沒有此限制(如程序8、9),讀
者可以將程序編譯后放到任意WWW服務(wù)器或FTP服務(wù)器,均可正常運(yùn)
行。
????此外,當(dāng)瀏覽器從本地盤打開調(diào)用Java Applet的HTML文檔時(shí),
也不受此限制。因此,本文所有的程序都可存放在本地盤編譯,只
要用netscape的File/Open File菜單打開,便可正確運(yùn)行。
????對于另一種Java程序--Java Application,也無此限制,例
如對于讀取網(wǎng)絡(luò)上文件內(nèi)容的程序10,對應(yīng)的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編譯后,
只需執(zhí)行“java showfile2”便可以在屏幕上打印出
http://www.shu.edu.cn/~xyx/doc/manhua.html 文件的內(nèi)容。
????九、創(chuàng)建URL對象的方法
????在前面的例子中我們統(tǒng)一使用new URL(url字符串)的形式創(chuàng)建
URL對象。其實(shí),Java提供了四種創(chuàng)建URL對象的形式:
????1.new URL(url字符串)????本文中的程序均采用此種格式,如:
new??URL("http://www.shu.edu.cn/~xyx/doc/manhua.html")
????2.new URL(協(xié)議,主機(jī)名,文件名或路徑)????如程序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(協(xié)議,主機(jī)名,端口號,文件名或路徑)1
如:new URL("http","www.shu.edu.cn",80, "/~xyx/doc/manhua.html")
????4.new URL(基準(zhǔn)url,文件名或路徑)
????十、實(shí)現(xiàn)網(wǎng)絡(luò)功能的其他方法
????以上著重介紹了利用Java的URL類實(shí)現(xiàn)從網(wǎng)絡(luò)上獲取聲音、 圖
象、HTML文檔及文件數(shù)據(jù)的編程方法。Java的網(wǎng)絡(luò)功能很強(qiáng)大,除
上面介紹的外,還可以利用URLconnection 類實(shí)現(xiàn)更廣泛的網(wǎng)絡(luò)功
能,如向WWW 服務(wù)器上的 CGI 程序發(fā)送信息等; 通過 Socket 及
ServerSocket類,可以自己編寫客戶軟件及服務(wù)軟件,并可以自己
設(shè)計(jì)通訊協(xié)議。
〖參考文獻(xiàn)〗
Laura Lemay,Charles L. Perkins??"Teach Yourself JAVA in 21 Days"
摘自《Internet世界》
posted on 2006-03-20 12:28
zjw_albert 閱讀(208)
評論(0) 編輯 收藏