




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第8章 網(wǎng)絡(luò)編程概述,8.1 概述 8.2 URL編程 8.3 Socket編程簡(jiǎn)介 實(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沒(méi)有對(duì)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ò)的路由選擇、流量控制和擁塞控制等問(wèn)題。,圖8.1 TCP/IP協(xié)議的層次結(jié)構(gòu),使用Java語(yǔ)言編寫(xiě)網(wǎng)絡(luò)通信程序通常是在應(yīng)用層,對(duì)某些特殊的
2、應(yīng)用可能需要直接基于傳輸層協(xié)議編程,一般無(wú)需關(guān)心網(wǎng)絡(luò)通信的具體細(xì)節(jié),特別是互聯(lián)網(wǎng)層和網(wǎng)絡(luò)接口層。 傳輸層提供在源結(jié)點(diǎn)和目標(biāo)結(jié)點(diǎn)的兩個(gè)進(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是一種無(wú)連接協(xié)議,可直接傳輸數(shù)據(jù),無(wú)需事先建立連接,直接發(fā)送帶有目標(biāo)結(jié)點(diǎn)信息的數(shù)據(jù)報(bào)。不同的數(shù)據(jù)報(bào)可能經(jīng)過(guò)不同的路徑到達(dá)目標(biāo)結(jié)點(diǎn),到達(dá)時(shí)的順序與出發(fā)時(shí)的順序也可能不同。,采用哪種傳輸層協(xié)議是由應(yīng)用程序的需要決定的,如果可靠性更重要的話,用面向連接的協(xié)
3、議會(huì)好一些。比如文件服務(wù)器需要保證數(shù)據(jù)的正確性和有序性,如果一些數(shù)據(jù)丟失了,系統(tǒng)的有效性將會(huì)失去。而有一些服務(wù)器是間歇性地發(fā)送一些數(shù)據(jù)塊的,如果數(shù)據(jù)丟失,服務(wù)器并不需要再重新發(fā)送,因?yàn)楫?dāng)數(shù)據(jù)到達(dá)的時(shí)候,它可能已經(jīng)過(guò)時(shí)了。確保數(shù)據(jù)的有序性和正確性需要額外的操作和存儲(chǔ)空間,這將會(huì)降低系統(tǒng)的響應(yīng)速率。,傳輸層的上一層是應(yīng)用層,應(yīng)用層包括所有的高層協(xié)議。早期的應(yīng)用層有遠(yuǎn)程登錄協(xié)議(Telnet)、文件傳輸協(xié)議(File Transfer Protocol ,F(xiàn)TP)和簡(jiǎn)單郵件傳輸協(xié)議(Simple MailTransfer Protocol ,SMTP)等。目前使用最廣泛的應(yīng)用層協(xié)議是用于從Web服務(wù)
4、器讀取頁(yè)面信息的超文本傳輸協(xié)議(Hyper Text Transfer Protocol,HTTP)。,端口(Port)與IP地址一起為網(wǎng)絡(luò)通信的應(yīng)用程序之間提供一種確切的地址標(biāo)識(shí),IP地址標(biāo)識(shí)了發(fā)送數(shù)據(jù)的目的計(jì)算機(jī),而端口標(biāo)識(shí)了將數(shù)據(jù)包發(fā)送給目的計(jì)算機(jī)上的哪一個(gè)應(yīng)用程序,如圖8.2所示。應(yīng)用層協(xié)議通常采用客戶/服務(wù)器模式,應(yīng)用服務(wù)器啟動(dòng)后監(jiān)聽(tīng)特定的端口,客戶端需要服務(wù)時(shí)請(qǐng)求與服務(wù)器該端口建立連接。一些常用的應(yīng)用服務(wù)都有缺省的端口(稱為熟知端口),例如Web服務(wù)器缺省的端口號(hào)為80。,圖8.2 端口與IP地址的標(biāo)識(shí)作用,8.1.2 網(wǎng)絡(luò)編程的基本方法 Java語(yǔ)言專門(mén)為網(wǎng)絡(luò)通信提供了軟件包。采
5、用包提供的API可以快速方便地開(kāi)發(fā)基于網(wǎng)絡(luò)的應(yīng)用。 包對(duì)http協(xié)議提供了特別的支持。只需通過(guò)URL類對(duì)象指明圖像、聲音資源的位置,無(wú)需額外的工作,就可以輕松地從Web服務(wù)器上獲取圖像、聲音,或者通過(guò)流操作獲取HTML文檔及文本等資源,并可以對(duì)獲得的資源進(jìn)行處理。在本書(shū)4.1節(jié)的案例中從Web服務(wù)器下載廣告圖片就采用了這種方法,可以看出,使用這種方法下載圖像是相當(dāng)簡(jiǎn)單的。,包還提供了對(duì)TCP、UDP協(xié)議套接字(Socket)編程的支持,可以建立用戶自己的服務(wù)器,實(shí)現(xiàn)特定的應(yīng)用。Socket是一種程序接口,最初由California大學(xué)Berkeley分校開(kāi)發(fā),是用于簡(jiǎn)化網(wǎng)絡(luò)通信的一種工具,是U
6、NIX操作系統(tǒng)的一個(gè)組成部分?,F(xiàn)在Socket的概念已深入到各種操作環(huán)境,包括Java。,8.2 URL 編 程,8.2.1 URL的概念 URL(Uniform Resource Locator,統(tǒng)一資源定位器)用來(lái)標(biāo)識(shí)Internet上的資源,指明取得資源采用的協(xié)議和地址,通過(guò)URL可以訪問(wèn)Internet上相應(yīng)的文件和其他資源。 典型的URL格式為 協(xié)議名:/主機(jī)名:端口號(hào)/資源路徑,協(xié)議名用于指明獲取資源所用的傳輸協(xié)議,例如http、ftp、gopher等;主機(jī)名指明資源所在的計(jì)算機(jī),端口號(hào)指明服務(wù)器的端口號(hào),對(duì)于常用的一些協(xié)議(如http、ftp等),如果不指明端口號(hào),則使用該協(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中的一個(gè)位置。,上面定義的URL形式包含訪問(wèn)網(wǎng)絡(luò)資源的完整路徑,通常稱為絕對(duì)URL。在HTML文檔中通常還會(huì)使用相對(duì)URL。一個(gè)相對(duì)URL不包括協(xié)議或主機(jī)信息,用于指定與當(dāng)前文檔處于相同主機(jī)的HTML文檔。相對(duì)URL可
8、能包括相對(duì)路徑的成員,也可能是URL片斷。例如,在,system-configurations.html 表示資源 configurations.html。同樣,相對(duì)URL: /j2se/1.4.2/system-configurations.html 也表示該資源。,8.2.2 URL類 1URL對(duì)象的創(chuàng)建 用Java語(yǔ)言訪問(wèn)Web資源是通過(guò)URL類來(lái)實(shí)現(xiàn)的,URL類定義了一個(gè)Web資源的統(tǒng)一資源定位器和可以對(duì)其進(jìn)行的一些操作。URL類的對(duì)象指向Web資源(如Web頁(yè)、文本文件、圖形圖像文件、音頻視頻文件等等),創(chuàng)建URL對(duì)象后可取得URL的各個(gè)部分的信息和獲取URL內(nèi)容。 URL類的構(gòu)造方
9、法有多種形式,下面是常用的幾種形式:,(1) public URL(String spec) throws MalformedURLException:簡(jiǎn)單地用一個(gè)字符串生成URL對(duì)象,如: URL url0=new URL(,(2) public URL(String protocol,String host,String file) throws MalformedURLException: 分開(kāi)指定URL的各個(gè)部分,包括協(xié)議、主機(jī)名、資源路徑,采用缺省端口構(gòu)成URL對(duì)象,如: 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:分開(kāi)指定的URL各個(gè)部分構(gòu)成URL對(duì)象,如: 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)造相對(duì)URL對(duì)象,如: URL base1=new URL(http:/ ); URL url3=new U
11、RL( base, download.html);,這種方法常用于Java Applet。Applet類提供了方法getDocumentBase和getCodeBase,分別用于獲得當(dāng)前Applet所在頁(yè)面的目錄路徑和Applet所在的目錄路徑,關(guān)于這一點(diǎn)程序4.1中已介紹過(guò),本章不再詳述。在Applet中可采用類似下面的代碼來(lái)構(gòu)造URL對(duì)象: URL url1=new URL(getDocumentBase(),file1.txt); URL url2=new URL(getCodeBase(),file2.txt);,URL類的構(gòu)造方法都拋出MalformedURLException異常,
12、生成URL對(duì)象時(shí),必須對(duì)這一異常進(jìn)行處理。例如: try URL myURL=new URL( catch (MalformedURLException e) System.out.println(MalformedURLException:+e); ,URL對(duì)象創(chuàng)建后,不再可以修改該對(duì)象所表示的URL地址,但可以通過(guò)URL類提供的方法成員來(lái)獲取其屬性,如協(xié)議、主機(jī)名、端口號(hào)、文件名等。常用的方法有: public int getPort():得到URL對(duì)象的端口號(hào); public String getProtocol():得到URL對(duì)象的協(xié)議名;, public String getHost
13、():得到URL對(duì)象的主機(jī)名; public String getFile():得到URL對(duì)象的文件名; public String getRef():得到URL對(duì)象的參考點(diǎn); public boolean equals(Object obj):比較兩個(gè)URL,不包括參考點(diǎn)。,2從網(wǎng)絡(luò)上獲取圖像 Java Applet可以使用getImage方法直接從Web服務(wù)器獲取圖像資源,目前支持的圖像文件格式為GIF和JPEG兩種,第4章的程序4.1就采用了這種方法從服務(wù)器下載廣告圖片。下面再來(lái)看一個(gè)簡(jiǎn)單的例子。,【程序8.1】 使用相對(duì)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。在該例中,首先用語(yǔ)句 getImage(getDocumentBase(), test.gif);,從HTML文檔所在位置下載圖像test.gif,并創(chuàng)建一
15、個(gè)Image類型的對(duì)象image,然后在paint方法中用語(yǔ)句 g.drawImage(image, 0, 0,this); 在屏幕上將圖像顯示出來(lái)。 Applet類提供的getImage方法有兩種形式: Image getImage(URL url,String name); Image getImage(URL url)。,程序8.1采用了第一種形式,圖像資源的完整路徑由第一個(gè)參數(shù)表示的路徑目錄與第二個(gè)字符串參數(shù)表示的相對(duì)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 ); ,不過(guò),在Java Applet中一般很少采用絕對(duì)URL,因?yàn)槌鲇诎踩缘目紤],瀏覽器只允許Java Applet訪問(wèn)與Applet同一主機(jī)的資源。如果采用絕對(duì)URL,則當(dāng)Applet放到其他的Web服務(wù)器上運(yùn)行時(shí),必須修改程序。,【程序8.2】 使用絕對(duì)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采用絕對(duì)URL,試圖顯示 J+下使用WJView.exe調(diào)試時(shí),可以在控制臺(tái)看到如下信息: com.ms.security.SecurityExceptionExHost: cannot access :80
18、 atcom/ms/security/permissions/NetIOPermission.check (NetIOPermission.java),下面還有若干行,這里省略了。該信息表明getImage方法無(wú)法訪問(wèn),引發(fā)了安全性異常SecurityExceptionEx。如果使用JDK的appletviewer運(yùn)行該程序,輸出信息有所不同,getImage方法失敗,image對(duì)象為null,Graphics類的drawImage方法無(wú)法正確繪制圖像,從而引發(fā)異常。,getImage方法在調(diào)用后立即返回,并不等待圖像全部載入。因此有時(shí)會(huì)出現(xiàn)drawImage方法在圖像沒(méi)有載入之前就開(kāi)始執(zhí)行了
19、,導(dǎo)致程序剛執(zhí)行時(shí)圖像不能正確顯示。為解決這個(gè)問(wèn)題,Java提供了MediaTracker類,用于跟蹤圖像及聲音等媒體的載入。 MediaTracker使用方法如下: (1) 構(gòu)造一個(gè)MediaTracker對(duì)象; (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對(duì)象 tracker.addImage(image,0);/添加需要跟蹤的圖片,tracker.waitForAll(); catch(Exception e) init方法等待圖像載入完畢后才返回,以確保paint方法被調(diào)用時(shí)圖像已全部載入。 MediaTracker類的構(gòu)造函數(shù)為 public MediaTracker(Component comp) 即為給定組件創(chuàng)建一個(gè)跟蹤媒體的MediaTracker對(duì)象。,下面是MediaTracker類的幾種常用方法: public void addIm
21、age(Image image, int id):將圖像添加到被跟蹤的圖像組。參數(shù)image為需跟蹤的圖像,參數(shù)id為圖像組指定標(biāo)識(shí)。 public boolean checkAll():檢查所有圖像是否下載完畢。 public boolean checkAll(boolean load):檢查所有圖像是否下載完畢。參數(shù)load若為true,且圖像尚未開(kāi)始下載,則立即開(kāi)始下載。, public boolean checkID(int id)。 public boolean checkID(int id,boolean load)。 以上兩種方法用于檢查指定id的圖像是否完成下載,參數(shù)load的
22、含義同checkAll方法。 public Object getErrorsAny():返回出錯(cuò)的媒體組 。 public Object getErrorsID(int id):返回帶有給定標(biāo)識(shí)號(hào)的出錯(cuò)的媒體組。 public boolean isErrorAny():檢查所有圖像的錯(cuò)誤狀態(tài) 。, public boolean isErrorID(int id):檢查所有帶有給定標(biāo)識(shí)號(hào)的圖像的錯(cuò)誤狀態(tài)。 public void waitForAll() throws InterruptedException:開(kāi)始下載所有的圖像,直到下載完畢后返回。 public boolean waitFor
23、All(long ms) throws InterruptedException:開(kāi)始下載所有的圖像,直到下載完畢或參數(shù)ms指定的時(shí)間(毫秒數(shù))到達(dá)后返回。, public void waitForID(int id) throws InterruptedException。 public boolean waitForID(int id,long ms) throws InterruptedException:等待載入指定標(biāo)識(shí)的圖像,參數(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(下載時(shí)發(fā)生錯(cuò)誤)、LOADING(正在下載)。參數(shù)load若為true,則表示如果圖像尚未開(kāi)始下載,立即啟動(dòng)下載過(guò)程。,3從網(wǎng)絡(luò)上獲取聲音 與獲取圖像類似,Java也提供了從Web服務(wù)器獲取聲音資源并播放的方法。Java 2以前的版本只能處理單聲道8 kHz的采樣頻率的AU文件,Java 2增加了對(duì)AIFF,WAV以及三種MIDI文件類型的支持??梢岳肁pplet類的方法play直接播放網(wǎng)絡(luò)上的聲音文件,或使
25、用getAudioClip方法先從網(wǎng)絡(luò)上獲取聲音資源,生成AudioClip類型的對(duì)象,然后對(duì)該對(duì)象進(jìn)行操作。,play方法有兩種形式: void play(URL url):使用絕對(duì)URL表示聲音資源的訪問(wèn)路徑。 void play(URL url,String name):使用相對(duì)URL表示聲音資源的訪問(wèn)路徑。,類似地,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語(yǔ)言定義的支持聲音播放的接口,該接口定義了下面三個(gè)抽象方法: void loop():循環(huán)播放該聲音資源; void play():開(kāi)始播放該聲音資源; void stop():停止播放該聲音資源。
27、 利用這三個(gè)方法可以控制聲音的播放,程序8.4是一個(gè)簡(jiǎn)單的例子。,【程序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í)行時(shí)顯示三個(gè)按鈕,如圖8.3所示,點(diǎn)擊按鈕可以分別調(diào)用play、stop、loop方法。,圖8.3 聲音資源的播放,4顯示網(wǎng)絡(luò)上的其他HTML文檔 對(duì)于Web服務(wù)器上的HTML文檔,Java Applet有兩種訪問(wèn)方法:一種是由瀏覽器打開(kāi)該網(wǎng)頁(yè),另一種由Applet直接讀取HTML文檔。這里先介紹第一種方法,程序4.1中單擊廣告圖片后,瀏覽器打開(kāi)一個(gè)新窗口瀏覽指定的網(wǎng)頁(yè),采用的就是這種方法。 瀏覽器顯示指定網(wǎng)頁(yè)是利用Applet類的方法getAppletContex
30、t來(lái)實(shí)現(xiàn)的,該方法返回一個(gè)AppletContext對(duì)象,Java Applet通過(guò)該對(duì)象訪問(wèn)瀏覽器。,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)容請(qǐng)參考HTML標(biāo)準(zhǔn)中有關(guān)框架的內(nèi)容)中打開(kāi)指定的網(wǎng)頁(yè);第二種形式在指定的瀏覽器窗口(或框架中)打開(kāi)指定
31、的網(wǎng)頁(yè)。程序8.5演示了ShowDocument方法的使用,程序執(zhí)行畫(huà)面如圖8.4所示。程序中的窗口名_blank表示始終在新窗口中打開(kāi)指定網(wǎng)頁(yè)。,圖8.4 程序8.5運(yùn)行畫(huà)面,【程序8.5】 用瀏覽器打開(kāi)指定網(wǎng)頁(yè)。 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); /瀏覽器新建一個(gè)窗口打開(kāi)指定網(wǎng)頁(yè),else getAppletContext().showDocument(urlObj); /瀏覽器在當(dāng)前窗口中打開(kāi)指定網(wǎng)頁(yè) ,5讀取網(wǎng)絡(luò)上文件的內(nèi)容 上面的方法只是顯示或播放網(wǎng)絡(luò)上結(jié)點(diǎn)的圖像、聲音及HTML文檔,沒(méi)有對(duì)其內(nèi)容進(jìn)行處理。實(shí)際上,Java還可讀取網(wǎng)絡(luò)上文件的內(nèi)容,并對(duì)其內(nèi)容進(jìn)行處理。 讀取網(wǎng)絡(luò)上文件內(nèi)容的步驟如下:,(1) 創(chuàng)建一個(gè)URL類型的對(duì)象。例如: String url = http:/ URL fileur; try fileur = new URL(url); catch ( MalformedURLExcepti
36、on e) System.out.println(Cant get URL: ); ,(2) 利用URL類的openStream方法獲得對(duì)應(yīng)的InputStream類的對(duì)象。例如: InputStream filecon = fileur.openStream(); (3) 將InputStream對(duì)象轉(zhuǎn)化為DataInputStream類的對(duì)象。例如: DataInputStream filedata = new DataInputStream(filecon); (4) 讀取內(nèi)容。例如,對(duì)上面的filedata,可用filedata.readLine一行一行讀取內(nèi)容,或用filedata.
37、readchar一個(gè)字符一個(gè)字符地讀取。,程序8.6和程序8.7分別演示了Java Applet與Java應(yīng)用程序讀取網(wǎng)絡(luò)文件的方法,它們的基本步驟相同。但是出于安全性考慮,Applet在瀏覽器中運(yùn)行時(shí)不允許與Applet所在主機(jī)外的其他主機(jī)建立聯(lián)系。Java Application無(wú)此限制,此外,當(dāng)瀏覽器從本地盤(pán)打開(kāi)調(diào)用Java Applet的HTML文檔時(shí),也不受此限制。,【程序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)頁(yè)的URL,使用JDK運(yùn)行時(shí)在命令行中輸入U(xiǎn)RL。 例如: java downHtmlApp ,8.2.3 URL
42、Connection類 上面介紹了使用URL類打開(kāi)輸入流獲取網(wǎng)絡(luò)資源的方法,但有時(shí)可能還需要向Web服務(wù)器發(fā)送信息,例如在程序中使POST方法向Web服務(wù)器發(fā)送一個(gè)表單,必須使用URLConnection類。URLConnection類可提供的信息比URL類要多得多,除了可以獲取資源數(shù)據(jù)外,還可以提供資源長(zhǎng)度、發(fā)送時(shí)間、最新更新時(shí)間、編碼、標(biāo)題等許多信息。它是所有Java程序和URL之間創(chuàng)建通信鏈路的類的抽象超類,可用于連接由 URL 標(biāo)識(shí)的任何資源。該類的對(duì)象既可用于從資源中讀,也可用于往資源中寫(xiě)。,通常,Java程序無(wú)需創(chuàng)建URLConnection類的對(duì)象,一旦成功創(chuàng)建一個(gè)URL類的對(duì)象
43、,可以通過(guò)使用openConnection方法來(lái)獲得URLConnection類的對(duì)象。 使用openConnection不需要參數(shù),操作成功之后,返回一個(gè)URLConnection類的對(duì)象。下面的代碼段演示了打開(kāi)一個(gè)到URL連接的過(guò)程:,try URL url = new URL(); URLConnection connection = url.openConnection(); catch (Exception e) System.out.println(e.toString(); ,一旦成功地建立了一個(gè)連接,就可以獲得針對(duì)這個(gè)連接的輸出流進(jìn)行寫(xiě)操作,或者獲得針對(duì)這個(gè)連接的輸入流進(jìn)行讀操
44、作。URL可以代表很多不同種類的數(shù)據(jù)類型所組成的資源,但可以用同樣的方式對(duì)從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)行寫(xiě)操作同樣也很簡(jiǎn)單,建立一個(gè)成功的連接之后,首先調(diào)用setDoOutput方法將輸出(Output)屬性設(shè)置為真(true),指定該連接可以進(jìn)行寫(xiě)操作。下面的程序片斷演示了如何把數(shù)據(jù)寫(xiě)入一個(gè)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é)最后再來(lái)看幾個(gè)使用URL、URLConnection類的實(shí)例。 程序8.8實(shí)現(xiàn)了一個(gè)Applet,運(yùn)行畫(huà)面如圖8.5所示,在下拉式列表框中選擇搜索引擎名,然后單擊“Go”按鈕,瀏覽器將顯示對(duì)應(yīng)搜索引擎的主頁(yè)。,圖8.5 程序8.8運(yùn)行畫(huà)面,【程序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相似,不過(guò)所顯示的廣告內(nèi)容不再固定,而是由adcfg.txt文件確定。該文件與Applet字節(jié)碼文件存儲(chǔ)在相同的位置,Applet初始化時(shí)下載該文件,確定顯示的廣告圖片和對(duì)應(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ā)布動(dòng)態(tài)信息的方法。該程序采用了多線程技術(shù),每隔一定時(shí)間自動(dòng)到相應(yīng)Web服務(wù)器讀取最新的內(nèi)容。如果在Applet讀取的文件中存放一些變化較快的信息,如股市行情等,并由其他程序動(dòng)態(tài)地更新其內(nèi)容,
57、則在網(wǎng)頁(yè)中加入這種Java Applet,可以讓瀏覽者得到動(dòng)態(tài)的信息。進(jìn)一步,也可以在程序中對(duì)數(shù)據(jù)進(jìn)行處理,并用圖形方式顯示處理結(jié)果。例如,將各時(shí)刻的數(shù)據(jù)繪制成曲線,瀏覽者就可以看到動(dòng)態(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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 地?zé)崮芾庙?xiàng)目場(chǎng)地調(diào)研服務(wù)費(fèi)用協(xié)議
- 口腔門(mén)診護(hù)士規(guī)劃方案
- 體育素養(yǎng)面試題及答案
- 溫州瑞南220千伏輸變電工程環(huán)境影響報(bào)告表
- 精裝修公寓水電費(fèi)分?jǐn)偣芾矸?wù)合同
- 公寓銷售外包方案
- 資質(zhì)工作考核方案
- 化工廠吊裝方案
- 涂裝安全考試題及答案
- 平邑幼教面試題及答案
- 新成立傳媒公司策劃方案
- 全麻術(shù)后病人的護(hù)理
- 病區(qū)醫(yī)院感染管理質(zhì)量評(píng)價(jià)標(biāo)準(zhǔn)(2024年)
- 2025至2030全球及中國(guó)廚房顯示系統(tǒng)(KDS)行業(yè)項(xiàng)目調(diào)研及市場(chǎng)前景預(yù)測(cè)評(píng)估報(bào)告
- 2025年北京市高考語(yǔ)文試卷(含答案)
- 2025年高考湖北卷物理真題(解析版)
- 專題:任務(wù)型閱讀30篇 中考英語(yǔ)高分提升之最 新題速遞第三輯(答案+解析)
- 中國(guó)隱身材料行業(yè)發(fā)展分析及發(fā)展前景與投資研究報(bào)告2025-2028版
- 2025年浙江省中考數(shù)學(xué)試卷真題(含官方標(biāo)準(zhǔn)答案及解析)
- 譯林版(2024)七年級(jí)下冊(cè)英語(yǔ)期末復(fù)習(xí)綜合練習(xí)試卷(含答案)
- 汽車構(gòu)造試題及答案
評(píng)論
0/150
提交評(píng)論