摘 要:本文初步介紹了如何使用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(協議,主機名,端口號,文件名或路徑),如:
new URL("http","wwwbianceng.cn",80, "/~xyx/doc/manhua.html")
4.new URL(基准url,文件名或路徑)
十、實現網絡功能的其他方法
以上著重介紹了利用Java的URL類實現從網絡上獲取聲音、 圖象、HTML文檔及文件數據的編程方法。Java的網絡功能很強大,除上面介紹的外,還可以利用URLconnection 類實現更廣泛的網絡功能,如向WWW 服務器上的CGI 程序發送信息等;通過 Socket 及 ServerSocket類,可以自己編寫客戶軟件及服務軟件,並可以自己設計通訊協議。