java程序設(shè)計(jì) 課件 第8章 網(wǎng)絡(luò)編程概述.ppt_第1頁
java程序設(shè)計(jì) 課件 第8章 網(wǎng)絡(luò)編程概述.ppt_第2頁
java程序設(shè)計(jì) 課件 第8章 網(wǎng)絡(luò)編程概述.ppt_第3頁
java程序設(shè)計(jì) 課件 第8章 網(wǎng)絡(luò)編程概述.ppt_第4頁
java程序設(shè)計(jì) 課件 第8章 網(wǎng)絡(luò)編程概述.ppt_第5頁
已閱讀5頁,還剩192頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、第8章 網(wǎng)絡(luò)編程概述,8.1 概述 8.2 URL編程 8.3 Socket編程簡介 實(shí)訓(xùn)八 用Java實(shí)現(xiàn)網(wǎng)絡(luò)通信 習(xí)題八,8.1 概 述,8.1.1 網(wǎng)絡(luò)技術(shù)基礎(chǔ) Internet上的計(jì)算機(jī)之間采用TCP/IP協(xié)議進(jìn)行通信,圖8.1是TCP/IP協(xié)議體系的層次結(jié)構(gòu)。TCP/IP沒有對OSI參考模型中的物理層和數(shù)據(jù)鏈路層作出規(guī)定,只是定義了網(wǎng)絡(luò)接口,使得TCP/IP協(xié)議可以運(yùn)行在各種硬件設(shè)備上。TCP/IP協(xié)議的互聯(lián)網(wǎng)層負(fù)責(zé)相鄰結(jié)點(diǎn)之間的數(shù)據(jù)傳送,處理網(wǎng)絡(luò)的路由選擇、流量控制和擁塞控制等問題。,圖8.1 TCP/IP協(xié)議的層次結(jié)構(gòu),使用Java語言編寫網(wǎng)絡(luò)通信程序通常是在應(yīng)用層,對某些特殊的

2、應(yīng)用可能需要直接基于傳輸層協(xié)議編程,一般無需關(guān)心網(wǎng)絡(luò)通信的具體細(xì)節(jié),特別是互聯(lián)網(wǎng)層和網(wǎng)絡(luò)接口層。 傳輸層提供在源結(jié)點(diǎn)和目標(biāo)結(jié)點(diǎn)的兩個進(jìn)程實(shí)體之間提供可靠的端到端的數(shù)據(jù)傳輸,TCP/IP模型提供了兩種傳輸層協(xié)議,即傳輸控制協(xié)議TCP和用戶數(shù)據(jù)報(bào)協(xié)議UDP。,TCP協(xié)議是面向連接的,在傳送數(shù)據(jù)之前必須與目標(biāo)結(jié)點(diǎn)建立連接,數(shù)據(jù)傳輸結(jié)束后關(guān)閉連接。而UDP是一種無連接協(xié)議,可直接傳輸數(shù)據(jù),無需事先建立連接,直接發(fā)送帶有目標(biāo)結(jié)點(diǎn)信息的數(shù)據(jù)報(bào)。不同的數(shù)據(jù)報(bào)可能經(jīng)過不同的路徑到達(dá)目標(biāo)結(jié)點(diǎn),到達(dá)時的順序與出發(fā)時的順序也可能不同。,采用哪種傳輸層協(xié)議是由應(yīng)用程序的需要決定的,如果可靠性更重要的話,用面向連接的協(xié)

3、議會好一些。比如文件服務(wù)器需要保證數(shù)據(jù)的正確性和有序性,如果一些數(shù)據(jù)丟失了,系統(tǒng)的有效性將會失去。而有一些服務(wù)器是間歇性地發(fā)送一些數(shù)據(jù)塊的,如果數(shù)據(jù)丟失,服務(wù)器并不需要再重新發(fā)送,因?yàn)楫?dāng)數(shù)據(jù)到達(dá)的時候,它可能已經(jīng)過時了。確保數(shù)據(jù)的有序性和正確性需要額外的操作和存儲空間,這將會降低系統(tǒng)的響應(yīng)速率。,傳輸層的上一層是應(yīng)用層,應(yīng)用層包括所有的高層協(xié)議。早期的應(yīng)用層有遠(yuǎn)程登錄協(xié)議(Telnet)、文件傳輸協(xié)議(File Transfer Protocol ,F(xiàn)TP)和簡單郵件傳輸協(xié)議(Simple MailTransfer Protocol ,SMTP)等。目前使用最廣泛的應(yīng)用層協(xié)議是用于從Web服務(wù)

4、器讀取頁面信息的超文本傳輸協(xié)議(Hyper Text Transfer Protocol,HTTP)。,端口(Port)與IP地址一起為網(wǎng)絡(luò)通信的應(yīng)用程序之間提供一種確切的地址標(biāo)識,IP地址標(biāo)識了發(fā)送數(shù)據(jù)的目的計(jì)算機(jī),而端口標(biāo)識了將數(shù)據(jù)包發(fā)送給目的計(jì)算機(jī)上的哪一個應(yīng)用程序,如圖8.2所示。應(yīng)用層協(xié)議通常采用客戶/服務(wù)器模式,應(yīng)用服務(wù)器啟動后監(jiān)聽特定的端口,客戶端需要服務(wù)時請求與服務(wù)器該端口建立連接。一些常用的應(yīng)用服務(wù)都有缺省的端口(稱為熟知端口),例如Web服務(wù)器缺省的端口號為80。,圖8.2 端口與IP地址的標(biāo)識作用,8.1.2 網(wǎng)絡(luò)編程的基本方法 Java語言專門為網(wǎng)絡(luò)通信提供了軟件包。采

5、用包提供的API可以快速方便地開發(fā)基于網(wǎng)絡(luò)的應(yīng)用。 包對http協(xié)議提供了特別的支持。只需通過URL類對象指明圖像、聲音資源的位置,無需額外的工作,就可以輕松地從Web服務(wù)器上獲取圖像、聲音,或者通過流操作獲取HTML文檔及文本等資源,并可以對獲得的資源進(jìn)行處理。在本書4.1節(jié)的案例中從Web服務(wù)器下載廣告圖片就采用了這種方法,可以看出,使用這種方法下載圖像是相當(dāng)簡單的。,包還提供了對TCP、UDP協(xié)議套接字(Socket)編程的支持,可以建立用戶自己的服務(wù)器,實(shí)現(xiàn)特定的應(yīng)用。Socket是一種程序接口,最初由California大學(xué)Berkeley分校開發(fā),是用于簡化網(wǎng)絡(luò)通信的一種工具,是U

6、NIX操作系統(tǒng)的一個組成部分?,F(xiàn)在Socket的概念已深入到各種操作環(huán)境,包括Java。,8.2 URL 編 程,8.2.1 URL的概念 URL(Uniform Resource Locator,統(tǒng)一資源定位器)用來標(biāo)識Internet上的資源,指明取得資源采用的協(xié)議和地址,通過URL可以訪問Internet上相應(yīng)的文件和其他資源。 典型的URL格式為 協(xié)議名:/主機(jī)名:端口號/資源路徑,協(xié)議名用于指明獲取資源所用的傳輸協(xié)議,例如http、ftp、gopher等;主機(jī)名指明資源所在的計(jì)算機(jī),端口號指明服務(wù)器的端口號,對于常用的一些協(xié)議(如http、ftp等),如果不指明端口號,則使用該協(xié)議缺

7、省的熟知端口;資源路徑指明該資源在服務(wù)器上的虛擬路徑。例如: http為協(xié)議名,為主機(jī)名稱,使用缺省的端口80,/ j2se/1.4.2/download.html為服務(wù)器上文件的虛擬路徑。,資源路徑還可以包含HTML文件中的參考位置(或稱為參考點(diǎn)),例如: :80/home/white_paper.html#intro_1 這里,intro_1為white_paper.html中的一個位置。,上面定義的URL形式包含訪問網(wǎng)絡(luò)資源的完整路徑,通常稱為絕對URL。在HTML文檔中通常還會使用相對URL。一個相對URL不包括協(xié)議或主機(jī)信息,用于指定與當(dāng)前文檔處于相同主機(jī)的HTML文檔。相對URL可

8、能包括相對路徑的成員,也可能是URL片斷。例如,在,system-configurations.html 表示資源 configurations.html。同樣,相對URL: /j2se/1.4.2/system-configurations.html 也表示該資源。,8.2.2 URL類 1URL對象的創(chuàng)建 用Java語言訪問Web資源是通過URL類來實(shí)現(xiàn)的,URL類定義了一個Web資源的統(tǒng)一資源定位器和可以對其進(jìn)行的一些操作。URL類的對象指向Web資源(如Web頁、文本文件、圖形圖像文件、音頻視頻文件等等),創(chuàng)建URL對象后可取得URL的各個部分的信息和獲取URL內(nèi)容。 URL類的構(gòu)造方

9、法有多種形式,下面是常用的幾種形式:,(1) public URL(String spec) throws MalformedURLException:簡單地用一個字符串生成URL對象,如: URL url0=new URL(,(2) public URL(String protocol,String host,String file) throws MalformedURLException: 分開指定URL的各個部分,包括協(xié)議、主機(jī)名、資源路徑,采用缺省端口構(gòu)成URL對象,如: URL url1=new URL(http, ,/j2se/1.4.2/download.html);,(3)

10、public URL(String protocol,String host,int port,String file) throws Malformed URLException:分開指定的URL各個部分構(gòu)成URL對象,如: URL url2=new URL(http, ,80, /j2se/1.4.2/download.html ); (2)、(3)兩種構(gòu)造方法不能構(gòu)造含有“# 參考點(diǎn)”的URL地址。,(4) public URL(URL context,String spec):構(gòu)造相對URL對象,如: URL base1=new URL(http:/ ); URL url3=new U

11、RL( base, download.html);,這種方法常用于Java Applet。Applet類提供了方法getDocumentBase和getCodeBase,分別用于獲得當(dāng)前Applet所在頁面的目錄路徑和Applet所在的目錄路徑,關(guān)于這一點(diǎn)程序4.1中已介紹過,本章不再詳述。在Applet中可采用類似下面的代碼來構(gòu)造URL對象: URL url1=new URL(getDocumentBase(),file1.txt); URL url2=new URL(getCodeBase(),file2.txt);,URL類的構(gòu)造方法都拋出MalformedURLException異常,

12、生成URL對象時,必須對這一異常進(jìn)行處理。例如: try URL myURL=new URL( catch (MalformedURLException e) System.out.println(MalformedURLException:+e); ,URL對象創(chuàng)建后,不再可以修改該對象所表示的URL地址,但可以通過URL類提供的方法成員來獲取其屬性,如協(xié)議、主機(jī)名、端口號、文件名等。常用的方法有: public int getPort():得到URL對象的端口號; public String getProtocol():得到URL對象的協(xié)議名;, public String getHost

13、():得到URL對象的主機(jī)名; public String getFile():得到URL對象的文件名; public String getRef():得到URL對象的參考點(diǎn); public boolean equals(Object obj):比較兩個URL,不包括參考點(diǎn)。,2從網(wǎng)絡(luò)上獲取圖像 Java Applet可以使用getImage方法直接從Web服務(wù)器獲取圖像資源,目前支持的圖像文件格式為GIF和JPEG兩種,第4章的程序4.1就采用了這種方法從服務(wù)器下載廣告圖片。下面再來看一個簡單的例子。,【程序8.1】 使用相對URL從Web服務(wù)器獲取圖像。 import java.apple

14、t.*; import java.awt.*; public class downImage extends Applet Image image; public void init() image=getImage(getDocumentBase(),test.gif);, public void paint(Graphics g) g.drawImage(image, 0, 0,this); 程序8.1獲取并顯示了圖像test.gif。在該例中,首先用語句 getImage(getDocumentBase(), test.gif);,從HTML文檔所在位置下載圖像test.gif,并創(chuàng)建一

15、個Image類型的對象image,然后在paint方法中用語句 g.drawImage(image, 0, 0,this); 在屏幕上將圖像顯示出來。 Applet類提供的getImage方法有兩種形式: Image getImage(URL url,String name); Image getImage(URL url)。,程序8.1采用了第一種形式,圖像資源的完整路徑由第一個參數(shù)表示的路徑目錄與第二個字符串參數(shù)表示的相對URL構(gòu)成。第二種形式直接使用完整的URL給出圖像資源的路徑。采用第二種形式代碼段形式通常像下面這樣:,String url = 圖像資源URL; Image image

16、; try image = getImage(new URL(url); catch(Exception e) System.out.println(Cant open the URL ); ,不過,在Java Applet中一般很少采用絕對URL,因?yàn)槌鲇诎踩缘目紤],瀏覽器只允許Java Applet訪問與Applet同一主機(jī)的資源。如果采用絕對URL,則當(dāng)Applet放到其他的Web服務(wù)器上運(yùn)行時,必須修改程序。,【程序8.2】 使用絕對URL從Web服務(wù)器獲取圖像。 import java.applet.*; import .*; import java.awt.*; public c

17、lass getImage extends Applet Image image; public void init() String url = ,try image = getImage(new URL(url); catch(Exception e) public void paint(Graphics g) g.drawImage(image, 0, 0,this); ,程序8.2采用絕對URL,試圖顯示 J+下使用WJView.exe調(diào)試時,可以在控制臺看到如下信息: com.ms.security.SecurityExceptionExHost: cannot access :80

18、 atcom/ms/security/permissions/NetIOPermission.check (NetIOPermission.java),下面還有若干行,這里省略了。該信息表明getImage方法無法訪問,引發(fā)了安全性異常SecurityExceptionEx。如果使用JDK的appletviewer運(yùn)行該程序,輸出信息有所不同,getImage方法失敗,image對象為null,Graphics類的drawImage方法無法正確繪制圖像,從而引發(fā)異常。,getImage方法在調(diào)用后立即返回,并不等待圖像全部載入。因此有時會出現(xiàn)drawImage方法在圖像沒有載入之前就開始執(zhí)行了

19、,導(dǎo)致程序剛執(zhí)行時圖像不能正確顯示。為解決這個問題,Java提供了MediaTracker類,用于跟蹤圖像及聲音等媒體的載入。 MediaTracker使用方法如下: (1) 構(gòu)造一個MediaTracker對象; (2) 在下載圖像(getImage)之后,使用addImage方法添加需要跟蹤的圖像; (3) 在顯示圖像(drawIamge)之前,使用waitForAll方法跟蹤圖像狀態(tài)。,例如,程序8.1的init方法可改為: public void init() try image=getImage(getDocumentBase(),test.gif); MediaTracker tr

20、acker = new MediaTracker(this); /構(gòu)造一MediaTracker對象 tracker.addImage(image,0);/添加需要跟蹤的圖片,tracker.waitForAll(); catch(Exception e) init方法等待圖像載入完畢后才返回,以確保paint方法被調(diào)用時圖像已全部載入。 MediaTracker類的構(gòu)造函數(shù)為 public MediaTracker(Component comp) 即為給定組件創(chuàng)建一個跟蹤媒體的MediaTracker對象。,下面是MediaTracker類的幾種常用方法: public void addIm

21、age(Image image, int id):將圖像添加到被跟蹤的圖像組。參數(shù)image為需跟蹤的圖像,參數(shù)id為圖像組指定標(biāo)識。 public boolean checkAll():檢查所有圖像是否下載完畢。 public boolean checkAll(boolean load):檢查所有圖像是否下載完畢。參數(shù)load若為true,且圖像尚未開始下載,則立即開始下載。, public boolean checkID(int id)。 public boolean checkID(int id,boolean load)。 以上兩種方法用于檢查指定id的圖像是否完成下載,參數(shù)load的

22、含義同checkAll方法。 public Object getErrorsAny():返回出錯的媒體組 。 public Object getErrorsID(int id):返回帶有給定標(biāo)識號的出錯的媒體組。 public boolean isErrorAny():檢查所有圖像的錯誤狀態(tài) 。, public boolean isErrorID(int id):檢查所有帶有給定標(biāo)識號的圖像的錯誤狀態(tài)。 public void waitForAll() throws InterruptedException:開始下載所有的圖像,直到下載完畢后返回。 public boolean waitFor

23、All(long ms) throws InterruptedException:開始下載所有的圖像,直到下載完畢或參數(shù)ms指定的時間(毫秒數(shù))到達(dá)后返回。, public void waitForID(int id) throws InterruptedException。 public boolean waitForID(int id,long ms) throws InterruptedException:等待載入指定標(biāo)識的圖像,參數(shù)ms的含義同waitForAll方法。 public int statusAll(boolean load)。 public int statusID(in

24、t id,boolean load)。,以上兩種方法用于返回所有圖像或指定id圖像的載入狀態(tài),狀態(tài)取值可以為:ABORTED(下載失敗)、COMPLETE (下載成功)、ERRORED(下載時發(fā)生錯誤)、LOADING(正在下載)。參數(shù)load若為true,則表示如果圖像尚未開始下載,立即啟動下載過程。,3從網(wǎng)絡(luò)上獲取聲音 與獲取圖像類似,Java也提供了從Web服務(wù)器獲取聲音資源并播放的方法。Java 2以前的版本只能處理單聲道8 kHz的采樣頻率的AU文件,Java 2增加了對AIFF,WAV以及三種MIDI文件類型的支持??梢岳肁pplet類的方法play直接播放網(wǎng)絡(luò)上的聲音文件,或使

25、用getAudioClip方法先從網(wǎng)絡(luò)上獲取聲音資源,生成AudioClip類型的對象,然后對該對象進(jìn)行操作。,play方法有兩種形式: void play(URL url):使用絕對URL表示聲音資源的訪問路徑。 void play(URL url,String name):使用相對URL表示聲音資源的訪問路徑。,類似地,getAudioClip方法也有兩種形式: AudioClip getAudioClip(URL url) AudioClip getAudioClip(URL url,String name) 程序8.3采用play方法播放與Applet同目錄的AU文件。,【程序8.3】

26、 聲音資源的播放。 import java.applet.*; import java.awt.*; import .*; public class MidiPlay extends Applet public void paint(Graphics g) try ,play( getCodeBase(),example.au); catch(Exception e) ,AudioClip是Java語言定義的支持聲音播放的接口,該接口定義了下面三個抽象方法: void loop():循環(huán)播放該聲音資源; void play():開始播放該聲音資源; void stop():停止播放該聲音資源。

27、 利用這三個方法可以控制聲音的播放,程序8.4是一個簡單的例子。,【程序8.4】 用AudioClip接口播放聲音資源。 import java.awt.*; import java.applet.*; import java.awt.event.*; public class SoundPlay extends Applet implements ActionListener ,Button playBtn = new Button(播放); Button stopBtn = new Button(停止); Button loopBtn = new Button(循環(huán)); AudioClip

28、 au ; public void init(), playBtn.addActionListener(this); stopBtn.addActionListener(this); loopBtn.addActionListener(this); add(playBtn); add(stopBtn); add(loopBtn);,au = getAudioClip(getCodeBase(),example.au); public void actionPerformed(ActionEvent e) Object obj = e.getSource(); if(obj=playBtn) a

29、u.play(); else if(obj=stopBtn) au.stop(); ,else au.loop(); 程序8.4執(zhí)行時顯示三個按鈕,如圖8.3所示,點(diǎn)擊按鈕可以分別調(diào)用play、stop、loop方法。,圖8.3 聲音資源的播放,4顯示網(wǎng)絡(luò)上的其他HTML文檔 對于Web服務(wù)器上的HTML文檔,Java Applet有兩種訪問方法:一種是由瀏覽器打開該網(wǎng)頁,另一種由Applet直接讀取HTML文檔。這里先介紹第一種方法,程序4.1中單擊廣告圖片后,瀏覽器打開一個新窗口瀏覽指定的網(wǎng)頁,采用的就是這種方法。 瀏覽器顯示指定網(wǎng)頁是利用Applet類的方法getAppletContex

30、t來實(shí)現(xiàn)的,該方法返回一個AppletContext對象,Java Applet通過該對象訪問瀏覽器。,AppletContext的方法showDocument可以顯示指定Web服務(wù)器的HTML文檔,包括Applet所在服務(wù)器以及網(wǎng)絡(luò)上的其他Web服務(wù)器。SowDocument方法有兩種形式: void ShowDocument(URL url); void ShowDocument(URL url,String target)。,第一種形式在當(dāng)前Applet所在的瀏覽器窗口(或框架,有關(guān)內(nèi)容請參考HTML標(biāo)準(zhǔn)中有關(guān)框架的內(nèi)容)中打開指定的網(wǎng)頁;第二種形式在指定的瀏覽器窗口(或框架中)打開指定

31、的網(wǎng)頁。程序8.5演示了ShowDocument方法的使用,程序執(zhí)行畫面如圖8.4所示。程序中的窗口名_blank表示始終在新窗口中打開指定網(wǎng)頁。,圖8.4 程序8.5運(yùn)行畫面,【程序8.5】 用瀏覽器打開指定網(wǎng)頁。 import java.applet.*; import java.awt.*; import .*; import java.awt.event.*; public class ShowHtml extends Applet implements ActionListener ,String theURL; Button javaHome = new Button( Butto

32、n sunHome = new Button( Button j2se = new Button( Checkbox newWin = new Checkbox(Open in new window); public void init() GridBagLayout gbl = new GridBagLayout();,GridBagConstraints gbc = new GridBagConstraints(); setLayout(gbl); gbc.gridwidth=gbc.REMAINDER; gbl.setConstraints(newWin,gbc); add(newWin

33、);,gbc.gridwidth=gbc.REMAINDER; gbl.setConstraints(javaHome,gbc); add(javaHome); javaHome.addActionListener(this); gbc.gridwidth=gbc.REMAINDER; gbl.setConstraints(sunHome,gbc); add(sunHome); sunHome.addActionListener(this);,gbc.gridwidth=gbc.REMAINDER; gbl.setConstraints(j2se,gbc); add(j2se); j2se.a

34、ddActionListener(this); public void actionPerformed(ActionEvent e) theURL = e.getActionCommand();,URL urlObj = null; try urlObj = new URL(theURL); catch (MalformedURLException ex) System.out.println(Cant open the URL ); ,if (urlObj != null) if(newWin.getState() getAppletContext().showDocument(urlObj

35、,_blank); /瀏覽器新建一個窗口打開指定網(wǎng)頁,else getAppletContext().showDocument(urlObj); /瀏覽器在當(dāng)前窗口中打開指定網(wǎng)頁 ,5讀取網(wǎng)絡(luò)上文件的內(nèi)容 上面的方法只是顯示或播放網(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)建一個URL類型的對象。例如: String url = http:/ URL fileur; try fileur = new URL(url); catch ( MalformedURLExcepti

36、on e) System.out.println(Cant 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.

37、readchar一個字符一個字符地讀取。,程序8.6和程序8.7分別演示了Java Applet與Java應(yīng)用程序讀取網(wǎng)絡(luò)文件的方法,它們的基本步驟相同。但是出于安全性考慮,Applet在瀏覽器中運(yùn)行時不允許與Applet所在主機(jī)外的其他主機(jī)建立聯(lián)系。Java Application無此限制,此外,當(dāng)瀏覽器從本地盤打開調(diào)用Java Applet的HTML文檔時,也不受此限制。,【程序8.6】 下載HTML文件的Java小程序。 import java.io.*; import .*; import java.awt.*; import java.applet.*; public class d

38、ownHtml extends Applet URL fileur;,TextArea showarea = new TextArea(Please wait a while for gettext,10,30); public void init() try fileur = new URL(getCodeBase(),Page1.htm); catch ( MalformedURLException e) System.out.println(Cant get URL: ); ,add(showarea); public void paint(Graphics g) InputStream

39、 filecon = null; DataInputStream filedata = null; String fileline; showarea.setText(); try ,filecon = fileur.openStream(); filedata = new DataInputStream(filecon); while (fileline = filedata.readLine() != null) showarea.append(fileline+n); ,catch (IOException e) System.out.println(Error in I/O: + e.

40、getMessage(); ,【程序8.7】 下載HTML文件的Java應(yīng)用程序。 import .*; import java.io.*; public class downHtmlApp public static void main (String args) if(args.length!=1),System.out.print(Error!); System.exit(1); URL theUrl; try theUrl = new URL(args0); InputStream filecon = theUrl.openStream(); String fileline = nul

41、l;,InputStreamReader fr = new InputStreamReader(filecon); BufferedReader br = new BufferedReader(fr); while(fileline = br.readLine()!=null) System.out.println(fileline);,catch ( Exception e) System.out.println(e.getMessage() ); 程序8.7從命令行獲取要下載網(wǎng)頁的URL,使用JDK運(yùn)行時在命令行中輸入U(xiǎn)RL。 例如: java downHtmlApp ,8.2.3 URL

42、Connection類 上面介紹了使用URL類打開輸入流獲取網(wǎng)絡(luò)資源的方法,但有時可能還需要向Web服務(wù)器發(fā)送信息,例如在程序中使POST方法向Web服務(wù)器發(fā)送一個表單,必須使用URLConnection類。URLConnection類可提供的信息比URL類要多得多,除了可以獲取資源數(shù)據(jù)外,還可以提供資源長度、發(fā)送時間、最新更新時間、編碼、標(biāo)題等許多信息。它是所有Java程序和URL之間創(chuàng)建通信鏈路的類的抽象超類,可用于連接由 URL 標(biāo)識的任何資源。該類的對象既可用于從資源中讀,也可用于往資源中寫。,通常,Java程序無需創(chuàng)建URLConnection類的對象,一旦成功創(chuàng)建一個URL類的對象

43、,可以通過使用openConnection方法來獲得URLConnection類的對象。 使用openConnection不需要參數(shù),操作成功之后,返回一個URLConnection類的對象。下面的代碼段演示了打開一個到URL連接的過程:,try URL url = new URL(); URLConnection connection = url.openConnection(); catch (Exception e) System.out.println(e.toString(); ,一旦成功地建立了一個連接,就可以獲得針對這個連接的輸出流進(jìn)行寫操作,或者獲得針對這個連接的輸入流進(jìn)行讀操

44、作。URL可以代表很多不同種類的數(shù)據(jù)類型所組成的資源,但可以用同樣的方式對從URLConnection輸入流返回的數(shù)據(jù)進(jìn)行操作。下面的程序片斷演示了從URL中讀取文本數(shù)據(jù)的方法。,try URL url = new URL(); URLConnection connection = url.openConnection(); InputStream inStream = connection.getInputStream(); BufferedReader input = new BufferedReader(new InputStreamReader(inStream);,String li

45、ne = ; while (line = input.readLine() != null) System.out.println(line); catch (Exception e) System.out.println(e.toString(); ,進(jìn)行寫操作同樣也很簡單,建立一個成功的連接之后,首先調(diào)用setDoOutput方法將輸出(Output)屬性設(shè)置為真(true),指定該連接可以進(jìn)行寫操作。下面的程序片斷演示了如何把數(shù)據(jù)寫入一個URL。 try URL url = new URL(); URLConnection connection = url.openConnection(

46、); connection.setDoOutput(true); OutputStream outStream = connection.getOutputStream();,ObjectOutputStream objectStream = new ObjectOutputStream(outStream); objectStream.writeInt(54367); objectStream.writeObject(Hello there); objectStream.writeObject(new Date(); objectStream.flush(); catch (Exceptio

47、n e) System.out.println(e.toString(); ,8.2.4 實(shí)例 本節(jié)最后再來看幾個使用URL、URLConnection類的實(shí)例。 程序8.8實(shí)現(xiàn)了一個Applet,運(yùn)行畫面如圖8.5所示,在下拉式列表框中選擇搜索引擎名,然后單擊“Go”按鈕,瀏覽器將顯示對應(yīng)搜索引擎的主頁。,圖8.5 程序8.8運(yùn)行畫面,【程序8.8】 實(shí)例一。 import java.awt.*; import java.applet.*; import java.awt.event.*; import .*; import .URL; import .MalformedURLExcepti

48、on;,public class ListLink extends Applet implements ActionListener String urlList = String urlName= 雅虎中文,Google,新浪; Choice urlChoice;,public void init() urlChoice = new Choice(); Button btn= new Button(Go); for(int i=0;i3;i+) urlChoice.addItem(urlNamei);, add(urlChoice); btn.addActionListener(this);

49、 add(btn); public void actionPerformed(ActionEvent ev) String label =ev.getActionCommand(); if( label.equals(Go),int ch=urlChoice.getSelectedIndex(); LinkTo(ch); void LinkTo(int index) try,URL theURL=new URL(urlListindex); getAppletContext().showDocument(theURL); catch(Exception e) ,程序8.9的功能與第4章的案例程

50、序4.1相似,不過所顯示的廣告內(nèi)容不再固定,而是由adcfg.txt文件確定。該文件與Applet字節(jié)碼文件存儲在相同的位置,Applet初始化時下載該文件,確定顯示的廣告圖片和對應(yīng)的URL。,【程序8.9】 實(shí)例二。 import java.io.*; import java.awt.*; import java.awt.event.*; import java.applet.*; import .*;,class AdCfg Applet applet; String name,imagefile,url; Image image; public AdCfg(String name,Str

51、ing imagefile,String url,Applet applet) = name; this.imagefile = imagefile;,this.url = url; this.applet = applet; image = applet.getImage(applet.getCodeBase(),imagefile); public void Go() try URL theURL=new URL(url);,applet.getAppletContext().showDocument(theURL,newwin); catch(Exception e1

52、) public void Draw() applet.getGraphics().drawImage(image,0,0,applet); ,public class Ad extends Applet implements Runnable, MouseListener int CurAd=0,AdCount=0; boolean con=true; AdCfg adcfg = new AdCfg100; public void init() ,try URL cfgurl = new URL(getCodeBase(),adcfg.txt); InputStream cfginput =

53、 cfgurl.openStream(); BufferedReader cfgreader = new BufferedReader(new InputStreamReader(cfginput); int i=0; String cfgLine;,while(cfgLine = cfgreader.readLine()!=null) String splitstr = new String3; SplitStr(cfgLine,splitstr); /配置文件每一行為:名字,圖片文件名,URL adcfgi = new AdCfg(splitstr0,splitstr1,splitstr2

54、,this);,AdCount+; i+; catch(Exception e) public void start() ,Thread t=new Thread(this); addMouseListener(this); t.start(); public void paint(Graphics g) adcfgCurAd.Draw(); public void run(),/每隔兩秒鐘刷新廣告顯示 while(con) try Thread.sleep(2000); catch(Exception e) CurAd+; CurAd=CurAd%AdCount; repaint(); ,p

55、ublic void stop() con=false; removeMouseListener(this); public void mousePressed(MouseEvent e) public void mouseReleased(MouseEvent e) public void mouseEntered(MouseEvent e) public void mouseExited(MouseEvent e) public void mouseClicked(MouseEvent e),/鼠標(biāo)單擊事件響應(yīng)程序 adcfgCurAd.Go(); void SplitStr(String

56、 s,String str) /分解字符串,分解結(jié)果由str返回 String r=; int i=0; while(s.charAt(i)!=,),r=r+s.charAt(i); i+; str0=r; i+; r=; while(s.charAt(i)!=,) r=r+s.charAt(i);,i+; str1=r; i+; str2=s.substring(i); ,程序8.10演示了使用網(wǎng)絡(luò)資源發(fā)布動態(tài)信息的方法。該程序采用了多線程技術(shù),每隔一定時間自動到相應(yīng)Web服務(wù)器讀取最新的內(nèi)容。如果在Applet讀取的文件中存放一些變化較快的信息,如股市行情等,并由其他程序動態(tài)地更新其內(nèi)容,

57、則在網(wǎng)頁中加入這種Java Applet,可以讓瀏覽者得到動態(tài)的信息。進(jìn)一步,也可以在程序中對數(shù)據(jù)進(jìn)行處理,并用圖形方式顯示處理結(jié)果。例如,將各時刻的數(shù)據(jù)繪制成曲線,瀏覽者就可以看到動態(tài)變化的曲線。,【程序8.10】 實(shí)例三。 import java.io.*; import .*; import java.awt.*; import java.applet.*; public class dynaShow extends java.applet.Applet implements Runnable Thread dthread;,URL fileur; TextArea showarea =

58、 new TextArea(Wait for a while.,10,20); public void init() try fileur = new URL(getCodeBase(),dynaInf.txt); catch ( MalformedURLException e) System.out.println(Cant 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; BufferedReader filedata = null; String fileline; while(true) try ,filecon = fileur.openStream(); showarea.setText(); filedata = new B

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論