Java網(wǎng)絡(luò)編程_第1頁(yè)
Java網(wǎng)絡(luò)編程_第2頁(yè)
Java網(wǎng)絡(luò)編程_第3頁(yè)
Java網(wǎng)絡(luò)編程_第4頁(yè)
Java網(wǎng)絡(luò)編程_第5頁(yè)
已閱讀5頁(yè),還剩52頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第第11章章 網(wǎng)絡(luò)編程網(wǎng)絡(luò)編程教學(xué)目的要求1.了解網(wǎng)絡(luò)編程的基本知識(shí);了解網(wǎng)絡(luò)編程的基本知識(shí); 2.掌握使用掌握使用URL獲取網(wǎng)絡(luò)資源的方法;獲取網(wǎng)絡(luò)資源的方法;3.熟練掌握基于熟練掌握基于TCP的網(wǎng)絡(luò)通信技術(shù)。的網(wǎng)絡(luò)通信技術(shù)。11.1 網(wǎng)絡(luò)編程的基本概念網(wǎng)絡(luò)編程的基本概念 Java作為一種與平臺(tái)無(wú)關(guān)的語(yǔ)言,從一作為一種與平臺(tái)無(wú)關(guān)的語(yǔ)言,從一出現(xiàn)就與網(wǎng)絡(luò)有關(guān)極其密切的關(guān)系,因出現(xiàn)就與網(wǎng)絡(luò)有關(guān)極其密切的關(guān)系,因?yàn)闉镴ava寫(xiě)的程序可以在網(wǎng)絡(luò)上直接運(yùn)行,寫(xiě)的程序可以在網(wǎng)絡(luò)上直接運(yùn)行,使用使用Java,只需編寫(xiě)簡(jiǎn)單的代碼就能實(shí),只需編寫(xiě)簡(jiǎn)單的代碼就能實(shí)現(xiàn)強(qiáng)大的網(wǎng)絡(luò)功能。下面將介紹幾個(gè)與現(xiàn)強(qiáng)大的網(wǎng)絡(luò)功

2、能。下面將介紹幾個(gè)與Java網(wǎng)絡(luò)編程有關(guān)的概念。網(wǎng)絡(luò)編程有關(guān)的概念。TCP/IP協(xié)議概述協(xié)議概述 在編寫(xiě)網(wǎng)絡(luò)通信的在編寫(xiě)網(wǎng)絡(luò)通信的Java程序時(shí),是在應(yīng)用層編程序時(shí),是在應(yīng)用層編寫(xiě)程序的,所以根本不必關(guān)心寫(xiě)程序的,所以根本不必關(guān)心TCP/IP的層次,的層次,只要用只要用包中的類(lèi)即可,這些類(lèi)提供了包中的類(lèi)即可,這些類(lèi)提供了系統(tǒng)無(wú)關(guān)的網(wǎng)絡(luò)通信服務(wù)。但是即使如此,也系統(tǒng)無(wú)關(guān)的網(wǎng)絡(luò)通信服務(wù)。但是即使如此,也需了解一下需了解一下TCP/IP協(xié)議。協(xié)議。 確切地說(shuō),確切地說(shuō),TCP/IP協(xié)議是一組包括協(xié)議是一組包括TCP協(xié)議和協(xié)議和IP協(xié)議、協(xié)議、UDP(User Datagram Protocol)協(xié))

3、協(xié)議、議、ICMP(Internet Control Message Protocol)協(xié)議和其他一些協(xié)議的協(xié)議族。)協(xié)議和其他一些協(xié)議的協(xié)議族。TCP/IP通信協(xié)議采用了通信協(xié)議采用了4層的層級(jí)結(jié)構(gòu),每一層的層級(jí)結(jié)構(gòu),每一層都使用它的下一層所提供的網(wǎng)絡(luò)來(lái)完成自己層都使用它的下一層所提供的網(wǎng)絡(luò)來(lái)完成自己的需求。這的需求。這4層分別為:層分別為: 應(yīng)用層:應(yīng)用程序間溝通的層,如簡(jiǎn)單電子郵應(yīng)用層:應(yīng)用程序間溝通的層,如簡(jiǎn)單電子郵件傳輸(件傳輸(SMTP)、文件傳輸協(xié)議()、文件傳輸協(xié)議(FTP)、)、網(wǎng)絡(luò)遠(yuǎn)程訪問(wèn)協(xié)議(網(wǎng)絡(luò)遠(yuǎn)程訪問(wèn)協(xié)議(Telnet)等。)等。 傳輸層:在此層中,它提供了節(jié)點(diǎn)間的數(shù)

4、據(jù)傳傳輸層:在此層中,它提供了節(jié)點(diǎn)間的數(shù)據(jù)傳送服務(wù),如傳輸控制協(xié)議(送服務(wù),如傳輸控制協(xié)議(TCP)、用戶數(shù)據(jù))、用戶數(shù)據(jù)報(bào)協(xié)議(報(bào)協(xié)議(UDP)等,)等,TCP和和UDP給數(shù)據(jù)包加入給數(shù)據(jù)包加入傳輸數(shù)據(jù)并把它傳輸?shù)较乱粚又?,這一層負(fù)責(zé)傳輸數(shù)據(jù)并把它傳輸?shù)较乱粚又?,這一層負(fù)責(zé)傳送數(shù)據(jù),并且確定數(shù)據(jù)已被送達(dá)并接收。傳送數(shù)據(jù),并且確定數(shù)據(jù)已被送達(dá)并接收。 互連網(wǎng)絡(luò)層:負(fù)責(zé)提供基本的數(shù)據(jù)封包傳送功互連網(wǎng)絡(luò)層:負(fù)責(zé)提供基本的數(shù)據(jù)封包傳送功能,讓每一塊數(shù)據(jù)包都能夠到達(dá)目的主機(jī)(但能,讓每一塊數(shù)據(jù)包都能夠到達(dá)目的主機(jī)(但不檢查是否被正確接收),如網(wǎng)際協(xié)議(不檢查是否被正確接收),如網(wǎng)際協(xié)議(IP)。)。

5、網(wǎng)絡(luò)接口層:對(duì)實(shí)際的網(wǎng)絡(luò)媒體的管理,定義網(wǎng)絡(luò)接口層:對(duì)實(shí)際的網(wǎng)絡(luò)媒體的管理,定義如何使用實(shí)際網(wǎng)絡(luò)(如如何使用實(shí)際網(wǎng)絡(luò)(如Ethernet、Serial Line等)等)來(lái)傳送數(shù)據(jù)。來(lái)傳送數(shù)據(jù)。下面簡(jiǎn)單介紹下面簡(jiǎn)單介紹TCP/IP中的幾個(gè)主要協(xié)議的功能。中的幾個(gè)主要協(xié)議的功能。1.IP協(xié)議協(xié)議 網(wǎng)際協(xié)議網(wǎng)際協(xié)議IP是是TCP/IP的心臟,也是網(wǎng)絡(luò)層中最的心臟,也是網(wǎng)絡(luò)層中最重要的協(xié)議。重要的協(xié)議。 IP層接收由更低層(網(wǎng)絡(luò)接口層例如以太網(wǎng)設(shè)層接收由更低層(網(wǎng)絡(luò)接口層例如以太網(wǎng)設(shè)備驅(qū)動(dòng)程序)發(fā)來(lái)的數(shù)據(jù)包,并把該數(shù)據(jù)包發(fā)備驅(qū)動(dòng)程序)發(fā)來(lái)的數(shù)據(jù)包,并把該數(shù)據(jù)包發(fā)送到更高層送到更高層TCP或或UDP層;

6、相反,層;相反,IP層也層也把從把從TCP或或UDP層接收來(lái)的數(shù)據(jù)包傳送到更低層接收來(lái)的數(shù)據(jù)包傳送到更低層。層。IP數(shù)據(jù)包是不可靠的,因?yàn)閿?shù)據(jù)包是不可靠的,因?yàn)镮P并沒(méi)有做任并沒(méi)有做任何事情來(lái)確認(rèn)數(shù)據(jù)包是按順序發(fā)送的或者沒(méi)有何事情來(lái)確認(rèn)數(shù)據(jù)包是按順序發(fā)送的或者沒(méi)有被破壞。被破壞。IP數(shù)據(jù)包中含有發(fā)送它的主機(jī)的地址數(shù)據(jù)包中含有發(fā)送它的主機(jī)的地址(源地址)和接收它的主機(jī)的地址(目的地(源地址)和接收它的主機(jī)的地址(目的地址)。址)。2.TCP協(xié)議協(xié)議 TCP是是Tranfer Control Protocol的簡(jiǎn)稱(chēng),的簡(jiǎn)稱(chēng),是一種面向連接的保證可靠傳輸?shù)膮f(xié)議。是一種面向連接的保證可靠傳輸?shù)膮f(xié)議。通

7、過(guò)通過(guò)TCP協(xié)議傳輸,得到的是一個(gè)順序協(xié)議傳輸,得到的是一個(gè)順序的無(wú)差錯(cuò)的數(shù)據(jù)流。的無(wú)差錯(cuò)的數(shù)據(jù)流。 如果如果IP數(shù)據(jù)包中有已經(jīng)封好的數(shù)據(jù)包中有已經(jīng)封好的TCP數(shù)據(jù)數(shù)據(jù)包,那么包,那么IP將把它們向?qū)阉鼈兿颉吧仙稀眰魉偷絺魉偷絋CP層。層。TCP將包排序并進(jìn)行錯(cuò)誤檢查,將包排序并進(jìn)行錯(cuò)誤檢查,同時(shí)實(shí)現(xiàn)虛電路間的連接。同時(shí)實(shí)現(xiàn)虛電路間的連接。TCP數(shù)據(jù)包數(shù)據(jù)包中包括序號(hào)和確認(rèn),所以未按照順序收中包括序號(hào)和確認(rèn),所以未按照順序收到的包可以被排序,而損壞的包可以被到的包可以被排序,而損壞的包可以被重傳。重傳。 TCP是可靠的、面向連接的、連續(xù)的、流的協(xié)是可靠的、面向連接的、連續(xù)的、流的協(xié)議。當(dāng)應(yīng)用

8、程序需要一個(gè)可靠的、點(diǎn)對(duì)點(diǎn)的連議。當(dāng)應(yīng)用程序需要一個(gè)可靠的、點(diǎn)對(duì)點(diǎn)的連接進(jìn)行通信時(shí),就用接進(jìn)行通信時(shí),就用TCP協(xié)議。像協(xié)議。像HTTP、FTP、Telnet等應(yīng)用程序都需要一個(gè)可靠的通等應(yīng)用程序都需要一個(gè)可靠的通信媒介。數(shù)據(jù)在網(wǎng)絡(luò)上發(fā)送和接收的次序?qū)τ谛琶浇?。?shù)據(jù)在網(wǎng)絡(luò)上發(fā)送和接收的次序?qū)τ谀芊癯晒Φ膽?yīng)用能否成功的應(yīng)用HTTP讀取讀取URL資源是很重要資源是很重要的,數(shù)據(jù)的接收次序與發(fā)送的次序必須一樣,的,數(shù)據(jù)的接收次序與發(fā)送的次序必須一樣,否則就會(huì)收到一些錯(cuò)誤的信息。否則就會(huì)收到一些錯(cuò)誤的信息。 對(duì)于許多應(yīng)用程序來(lái)說(shuō),這種可靠性的保證是對(duì)于許多應(yīng)用程序來(lái)說(shuō),這種可靠性的保證是能否成功傳輸信

9、息的關(guān)鍵。然而,這種可靠的能否成功傳輸信息的關(guān)鍵。然而,這種可靠的傳輸方式并非對(duì)所有的應(yīng)用程序都適合。事實(shí)傳輸方式并非對(duì)所有的應(yīng)用程序都適合。事實(shí)上,上,TCP需要花費(fèi)大量的時(shí)間和帶寬來(lái)保證可需要花費(fèi)大量的時(shí)間和帶寬來(lái)保證可靠傳輸,有一些場(chǎng)合可靠傳輸并不是必須的??總鬏?,有一些場(chǎng)合可靠傳輸并不是必須的。3.UDP協(xié)議協(xié)議 UDP是是User Datagram Protocol(用戶數(shù)據(jù)報(bào)(用戶數(shù)據(jù)報(bào)協(xié)議)的簡(jiǎn)稱(chēng),是一種無(wú)連接的、不可靠的協(xié)協(xié)議)的簡(jiǎn)稱(chēng),是一種無(wú)連接的、不可靠的協(xié)議,每個(gè)數(shù)據(jù)報(bào)都是一個(gè)獨(dú)立的信息,包括完議,每個(gè)數(shù)據(jù)報(bào)都是一個(gè)獨(dú)立的信息,包括完整的源地址或目的地址,它在網(wǎng)絡(luò)上以任何

10、可整的源地址或目的地址,它在網(wǎng)絡(luò)上以任何可能的路徑傳往目的地,因此能否到達(dá)目的地,能的路徑傳往目的地,因此能否到達(dá)目的地,到達(dá)目的地的時(shí)間以及內(nèi)容的正確性都是不能到達(dá)目的地的時(shí)間以及內(nèi)容的正確性都是不能被保證的。但是這個(gè)協(xié)議的速度卻比較快,所被保證的。但是這個(gè)協(xié)議的速度卻比較快,所以在現(xiàn)在網(wǎng)絡(luò)基礎(chǔ)設(shè)施越來(lái)越好的情況下,使以在現(xiàn)在網(wǎng)絡(luò)基礎(chǔ)設(shè)施越來(lái)越好的情況下,使用用UDP協(xié)議的應(yīng)用程序也越來(lái)越多了。協(xié)議的應(yīng)用程序也越來(lái)越多了。 在在 J a v a 的的 j a v a . n e t 類(lèi) 庫(kù) 中 ,類(lèi) 庫(kù) 中 , U R L 、URLConnection、Socket、SocketServer

11、類(lèi)都類(lèi)都是 利 用是 利 用 T C P 在 網(wǎng) 絡(luò) 上 通 信 的 ; 而在 網(wǎng) 絡(luò) 上 通 信 的 ; 而DatagramPacket和和DatagramServer類(lèi)是使用類(lèi)是使用UDP的。本章將主要講述利用的。本章將主要講述利用TCP協(xié)議進(jìn)行通協(xié)議進(jìn)行通信的各個(gè)類(lèi)。信的各個(gè)類(lèi)。Socket套接字套接字 網(wǎng)絡(luò)上的兩個(gè)程序通過(guò)一個(gè)雙向的通信連接實(shí)現(xiàn)數(shù)據(jù)網(wǎng)絡(luò)上的兩個(gè)程序通過(guò)一個(gè)雙向的通信連接實(shí)現(xiàn)數(shù)據(jù)的交換,這個(gè)雙向鏈路的一端稱(chēng)為一個(gè)的交換,這個(gè)雙向鏈路的一端稱(chēng)為一個(gè)Socket,即,即Socket是面向客戶是面向客戶/服務(wù)器模型設(shè)計(jì)的,通常用服務(wù)器模型設(shè)計(jì)的,通常用Socket來(lái)實(shí)現(xiàn)客戶方和

12、服務(wù)方的連接??蛻舫绦蚩梢韵騺?lái)實(shí)現(xiàn)客戶方和服務(wù)方的連接??蛻舫绦蚩梢韵騍ocket寫(xiě)請(qǐng)求,服務(wù)器將處理此請(qǐng)求,然后通過(guò)寫(xiě)請(qǐng)求,服務(wù)器將處理此請(qǐng)求,然后通過(guò)Socket將結(jié)果返回給用戶。將結(jié)果返回給用戶。 Socket通信機(jī)制提供了兩種通信方式:有連接和無(wú)連通信機(jī)制提供了兩種通信方式:有連接和無(wú)連接方式,分別面向不同的應(yīng)用需求。使用有連接方式接方式,分別面向不同的應(yīng)用需求。使用有連接方式時(shí),通信鏈路提供了可靠的,全雙工的字節(jié)流服務(wù)。時(shí),通信鏈路提供了可靠的,全雙工的字節(jié)流服務(wù)。在該方式下,通信雙方必須創(chuàng)建一個(gè)連接過(guò)程并建立在該方式下,通信雙方必須創(chuàng)建一個(gè)連接過(guò)程并建立一條通信鏈路,以后的網(wǎng)絡(luò)通信

13、操作完全在這一對(duì)進(jìn)一條通信鏈路,以后的網(wǎng)絡(luò)通信操作完全在這一對(duì)進(jìn)程之間進(jìn)行,通信完畢則關(guān)閉此連接過(guò)程。使用無(wú)連程之間進(jìn)行,通信完畢則關(guān)閉此連接過(guò)程。使用無(wú)連接方式時(shí)其系統(tǒng)開(kāi)銷(xiāo)比有連接方式小,但通信鏈路提接方式時(shí)其系統(tǒng)開(kāi)銷(xiāo)比有連接方式小,但通信鏈路提供了不可靠的數(shù)據(jù)報(bào)服務(wù),不能保證信源所傳輸?shù)臄?shù)供了不可靠的數(shù)據(jù)報(bào)服務(wù),不能保證信源所傳輸?shù)臄?shù)據(jù)一定能夠到達(dá)信宿。在該方式下,通信雙方不必創(chuàng)據(jù)一定能夠到達(dá)信宿。在該方式下,通信雙方不必創(chuàng)建一個(gè)連接過(guò)程和建立一條通信鏈路,網(wǎng)絡(luò)通信操作建一個(gè)連接過(guò)程和建立一條通信鏈路,網(wǎng)絡(luò)通信操作在不同的主機(jī)和進(jìn)程之間轉(zhuǎn)發(fā)進(jìn)行。在不同的主機(jī)和進(jìn)程之間轉(zhuǎn)發(fā)進(jìn)行。端口端口 計(jì)

14、算機(jī)與網(wǎng)絡(luò)一般只有一個(gè)單獨(dú)的物理連接,計(jì)算機(jī)與網(wǎng)絡(luò)一般只有一個(gè)單獨(dú)的物理連接,所有的數(shù)據(jù)最終都要通過(guò)連接到達(dá)一個(gè)指定的所有的數(shù)據(jù)最終都要通過(guò)連接到達(dá)一個(gè)指定的計(jì)算機(jī)。然而,數(shù)據(jù)是傳向運(yùn)行在計(jì)算機(jī)上的計(jì)算機(jī)。然而,數(shù)據(jù)是傳向運(yùn)行在計(jì)算機(jī)上的不同應(yīng)用程序的,計(jì)算機(jī)需要知道數(shù)據(jù)傳向哪不同應(yīng)用程序的,計(jì)算機(jī)需要知道數(shù)據(jù)傳向哪個(gè)應(yīng)用程序,這就要用到端口。個(gè)應(yīng)用程序,這就要用到端口。 數(shù)據(jù)在網(wǎng)絡(luò)上傳送是與地址信息的傳送一起進(jìn)數(shù)據(jù)在網(wǎng)絡(luò)上傳送是與地址信息的傳送一起進(jìn)行的,地址信息表明了數(shù)據(jù)要傳向的計(jì)算機(jī)和行的,地址信息表明了數(shù)據(jù)要傳向的計(jì)算機(jī)和端口。計(jì)算機(jī)是一個(gè)端口。計(jì)算機(jī)是一個(gè)32位的位的IP地址標(biāo)識(shí),地

15、址標(biāo)識(shí),IP用用來(lái)把數(shù)據(jù)傳送到網(wǎng)絡(luò)上的目的計(jì)算機(jī)上。端口來(lái)把數(shù)據(jù)傳送到網(wǎng)絡(luò)上的目的計(jì)算機(jī)上。端口是用一個(gè)是用一個(gè)16位的數(shù)來(lái)表示,位的數(shù)來(lái)表示,TCP和和UDP都是通都是通過(guò)這個(gè)端口來(lái)指明數(shù)據(jù)要發(fā)往的應(yīng)用程序。過(guò)這個(gè)端口來(lái)指明數(shù)據(jù)要發(fā)往的應(yīng)用程序。 在面向連接的通信中,一個(gè)應(yīng)用程序與另一個(gè)在面向連接的通信中,一個(gè)應(yīng)用程序與另一個(gè)應(yīng)用程序的連接的建立是通過(guò)把一個(gè)端口號(hào)綁應(yīng)用程序的連接的建立是通過(guò)把一個(gè)端口號(hào)綁定在套接字上實(shí)現(xiàn)的。這樣就把應(yīng)用程序注冊(cè)定在套接字上實(shí)現(xiàn)的。這樣就把應(yīng)用程序注冊(cè)在操作系統(tǒng)中,從指定的端口接收所有的數(shù)據(jù)。在操作系統(tǒng)中,從指定的端口接收所有的數(shù)據(jù)。運(yùn)行在同一臺(tái)計(jì)算機(jī)上的兩個(gè)

16、應(yīng)用程序不可能運(yùn)行在同一臺(tái)計(jì)算機(jī)上的兩個(gè)應(yīng)用程序不可能綁定在同一個(gè)端口上,如果應(yīng)用程序試圖綁定綁定在同一個(gè)端口上,如果應(yīng)用程序試圖綁定在一個(gè)已經(jīng)在使用中的端口上將導(dǎo)致失敗。在在一個(gè)已經(jīng)在使用中的端口上將導(dǎo)致失敗。在面向消息的通信中,數(shù)據(jù)報(bào)包含了目的地的端面向消息的通信中,數(shù)據(jù)報(bào)包含了目的地的端口號(hào)??谔?hào)。TCP和和UDP協(xié)議是利用端口把流入的數(shù)協(xié)議是利用端口把流入的數(shù)據(jù)映射到運(yùn)行的計(jì)算機(jī)上的特定進(jìn)程。據(jù)映射到運(yùn)行的計(jì)算機(jī)上的特定進(jìn)程。 端口號(hào)是從端口號(hào)是從0到到65535(因?yàn)槎丝谑怯茫ㄒ驗(yàn)槎丝谑怯?6位二進(jìn)位二進(jìn)制數(shù)表示),其中制數(shù)表示),其中01023的端口號(hào)被系統(tǒng)保的端口號(hào)被系統(tǒng)保留,它

17、們被許多知名的服務(wù)占據(jù),如留,它們被許多知名的服務(wù)占據(jù),如HTTP、FTP和其他的系統(tǒng)服務(wù),應(yīng)用程序不能綁定這和其他的系統(tǒng)服務(wù),應(yīng)用程序不能綁定這些端口。些端口。URL URL(Uniform Resource Locator)是統(tǒng)一資源定位符)是統(tǒng)一資源定位符的簡(jiǎn)稱(chēng),它表明了的簡(jiǎn)稱(chēng),它表明了Internet上某一資源的地址。通過(guò)上某一資源的地址。通過(guò)URL,可以訪問(wèn),可以訪問(wèn)Internet和和WWW。瀏覽器通過(guò)解析給。瀏覽器通過(guò)解析給定的定的URL可以在網(wǎng)絡(luò)上查找相應(yīng)的文件或網(wǎng)絡(luò)資源??梢栽诰W(wǎng)絡(luò)上查找相應(yīng)的文件或網(wǎng)絡(luò)資源。IP地址定位了在互連網(wǎng)上的一臺(tái)計(jì)算機(jī),端口定義了地址定位了在互連網(wǎng)上

18、的一臺(tái)計(jì)算機(jī),端口定義了為這臺(tái)計(jì)算機(jī)上提供的服務(wù)。一個(gè)為這臺(tái)計(jì)算機(jī)上提供的服務(wù)。一個(gè)URL的語(yǔ)法格式如的語(yǔ)法格式如下:下: :/dir/filename protocol定義了傳輸協(xié)議,如定義了傳輸協(xié)議,如http、ftp、gopher、file等等;等等;hostname為主機(jī)域名或?yàn)橹鳈C(jī)域名或IP地址;地址;port為服務(wù)端為服務(wù)端口號(hào);口號(hào);dir和和filename分別為服務(wù)器上的目錄和文件名。分別為服務(wù)器上的目錄和文件名。URL具有強(qiáng)大的功能,它提供了統(tǒng)一的方法來(lái)存儲(chǔ)與具有強(qiáng)大的功能,它提供了統(tǒng)一的方法來(lái)存儲(chǔ)與單個(gè)類(lèi)中的一個(gè)特定資源進(jìn)行通信所需的全部信息;單個(gè)類(lèi)中的一個(gè)特定資源進(jìn)行通

19、信所需的全部信息;完成所有完成所有socket的創(chuàng)建、握手協(xié)議以及通過(guò)的創(chuàng)建、握手協(xié)議以及通過(guò)HTTP檢索檢索資源所需的解釋程序。資源所需的解釋程序。Java語(yǔ)言提供了類(lèi)語(yǔ)言提供了類(lèi).URL來(lái)實(shí)現(xiàn)利用來(lái)實(shí)現(xiàn)利用URL進(jìn)行網(wǎng)進(jìn)行網(wǎng)絡(luò)編程。該類(lèi)具有絡(luò)編程。該類(lèi)具有4個(gè)構(gòu)造器及其相應(yīng)的方法。利用構(gòu)造個(gè)構(gòu)造器及其相應(yīng)的方法。利用構(gòu)造器創(chuàng)建了器創(chuàng)建了URL對(duì)象后,對(duì)象后,Java提供了提供了2種方式來(lái)讀取網(wǎng)絡(luò)數(shù)種方式來(lái)讀取網(wǎng)絡(luò)數(shù)據(jù),一種是通過(guò)據(jù),一種是通過(guò)URL對(duì)象及相關(guān)方法直接得到相關(guān)的網(wǎng)對(duì)象及相關(guān)方法直接得到相關(guān)的網(wǎng)絡(luò)信息,首先創(chuàng)建一個(gè)絡(luò)信息,首先創(chuàng)建一個(gè)URL對(duì)象,然后使用對(duì)象,然后使用URL的方

20、法的方法openStream()與指定的與指定的URL建立連接并得到一個(gè)輸入流建立連接并得到一個(gè)輸入流InputStream類(lèi)的對(duì)象,在此基礎(chǔ)上可進(jìn)一步生成其它的類(lèi)的對(duì)象,在此基礎(chǔ)上可進(jìn)一步生成其它的輸入流對(duì)象實(shí)例,進(jìn)而對(duì)信息進(jìn)行操作;這種方法簡(jiǎn)單輸入流對(duì)象實(shí)例,進(jìn)而對(duì)信息進(jìn)行操作;這種方法簡(jiǎn)單直接,但缺乏靈活性,并且只能夠讀信息,因?yàn)樵S多直接,但缺乏靈活性,并且只能夠讀信息,因?yàn)樵S多Web提供了雙向?qū)υ挼墓δ?,因而就限制了這種方法的提供了雙向?qū)υ挼墓δ埽蚨拖拗屏诉@種方法的應(yīng)用。另一種是通過(guò)方法應(yīng)用。另一種是通過(guò)方法openConnection()生成相應(yīng)的生成相應(yīng)的URLConnecti

21、on對(duì)象,從而得到對(duì)象,從而得到InputStream輸入流或輸入流或InputStream對(duì)象,進(jìn)而對(duì)其進(jìn)行讀寫(xiě)操作。這種方法應(yīng)對(duì)象,進(jìn)而對(duì)其進(jìn)行讀寫(xiě)操作。這種方法應(yīng)用相當(dāng)廣泛,如向服務(wù)器的用相當(dāng)廣泛,如向服務(wù)器的CGI程序發(fā)送一些數(shù)據(jù),首程序發(fā)送一些數(shù)據(jù),首先必須與先必須與URL建立連接,然后對(duì)其進(jìn)行讀寫(xiě)操作,利用建立連接,然后對(duì)其進(jìn)行讀寫(xiě)操作,利用URLConnection類(lèi)提供的公用方法除了可以簡(jiǎn)單地訪問(wèn)類(lèi)提供的公用方法除了可以簡(jiǎn)單地訪問(wèn)網(wǎng)絡(luò)資源外,還可以訪問(wèn)某些協(xié)議提供的有關(guān)資源,如網(wǎng)絡(luò)資源外,還可以訪問(wèn)某些協(xié)議提供的有關(guān)資源,如資源的資源的MIME類(lèi)型(類(lèi)型(Multimedia

22、Internet Mail Extensions,多用途,多用途Internet郵件擴(kuò)展)、資源的更改時(shí)郵件擴(kuò)展)、資源的更改時(shí)間等。間等。11.2 使用使用URL獲取網(wǎng)絡(luò)資源獲取網(wǎng)絡(luò)資源 URL類(lèi)類(lèi) 在在Java的的包中,包含一些用于網(wǎng)絡(luò)編包中,包含一些用于網(wǎng)絡(luò)編程的類(lèi),其中程的類(lèi),其中URL類(lèi)可以很方便地利用類(lèi)可以很方便地利用URL地地址在址在Internet上進(jìn)行網(wǎng)絡(luò)通信并獲取網(wǎng)絡(luò)資源。上進(jìn)行網(wǎng)絡(luò)通信并獲取網(wǎng)絡(luò)資源。 URL對(duì)象是只寫(xiě)一次的對(duì)象,一旦創(chuàng)建了一個(gè)對(duì)象是只寫(xiě)一次的對(duì)象,一旦創(chuàng)建了一個(gè)URL對(duì)象,就不能再改變它的任何屬性(協(xié)議、對(duì)象,就不能再改變它的任何屬性(協(xié)議、主機(jī)名、文件

23、名和端口號(hào))。為了表示主機(jī)名、文件名和端口號(hào))。為了表示URL,中實(shí)現(xiàn)了類(lèi)中實(shí)現(xiàn)了類(lèi)URL??梢酝ㄟ^(guò)下面的構(gòu)??梢酝ㄟ^(guò)下面的構(gòu)造方法來(lái)初始化一個(gè)造方法來(lái)初始化一個(gè)URL對(duì)象:對(duì)象:構(gòu)造方法一:構(gòu)造方法一:public URL (String spec); 該構(gòu)造方法通過(guò)一個(gè)表示該構(gòu)造方法通過(guò)一個(gè)表示URL地址的字符串可以構(gòu)造地址的字符串可以構(gòu)造一個(gè)一個(gè)URL對(duì)象。例如:對(duì)象。例如: URL urlBase=new URL(http:/ ;構(gòu)造方法二:構(gòu)造方法二:public URL(URL context, String spec); 該構(gòu)造方法通過(guò)絕對(duì)該構(gòu)造方法通過(guò)絕對(duì)URL和相對(duì)和相對(duì)UR

24、L構(gòu)造一個(gè)構(gòu)造一個(gè)URL對(duì)對(duì)象。例如:象。例如: URL com163 = new URL (http:/ URL index163 = new URL(com163, index.html);構(gòu)造方法三:構(gòu)造方法三:public URL(String protocol, String host, String file);例如:例如: URL com163 = new URL(http, , /pages/net. html);構(gòu)造方法四:構(gòu)造方法四:public URL(String protocol, String host, int port, String file); 例如:例如:

25、 URL gamelan = new URL(http, , 80, Pages/net.html);注意:類(lèi)注意:類(lèi)URL的構(gòu)造方法都聲明拋棄非運(yùn)行時(shí)異的構(gòu)造方法都聲明拋棄非運(yùn)行時(shí)異常(常(MalformedURLException),因此生成),因此生成URL對(duì)象時(shí),必須要對(duì)這一異常進(jìn)行處理,通對(duì)象時(shí),必須要對(duì)這一異常進(jìn)行處理,通常是用常是用try-catch語(yǔ)句進(jìn)行捕獲。格式如下:語(yǔ)句進(jìn)行捕獲。格式如下:tryURL myURL= new URL()catch (MalformedURLException e) URL類(lèi)提供了多個(gè)方法進(jìn)行類(lèi)提供了多個(gè)方法進(jìn)行URL對(duì)象的查詢(xún),可以使對(duì)象的

26、查詢(xún),可以使用這些方法來(lái)獲取用這些方法來(lái)獲取URL的屬性信息,其中常用的方法的屬性信息,其中常用的方法有:有:getProtocol():返回:返回URL的協(xié)議標(biāo)識(shí)部分;的協(xié)議標(biāo)識(shí)部分;getHost():返回:返回URL的主機(jī)名部分;的主機(jī)名部分;getPort():將端口號(hào)作為整數(shù)返回,如沒(méi)有設(shè)置則返回:將端口號(hào)作為整數(shù)返回,如沒(méi)有設(shè)置則返回-1;getPath():返回該:返回該URL的路徑;的路徑;getFile():返回:返回URL的文件名部分;的文件名部分;getRef():返回:返回URL的引用部分。的引用部分。 當(dāng)然,并不是所有的當(dāng)然,并不是所有的URL地址都包括這些組成部分。

27、地址都包括這些組成部分。URL類(lèi)提供這些方法是因?yàn)轭?lèi)提供這些方法是因?yàn)镠TTP的的URL包括這些部包括這些部分,而分,而HTTP的的URL差不多是最通用的差不多是最通用的URL。從某種。從某種程序上講,程序上講,URL類(lèi)是以類(lèi)是以HTTP為中心的。無(wú)論使用什為中心的。無(wú)論使用什么構(gòu)造函數(shù)來(lái)創(chuàng)建么構(gòu)造函數(shù)來(lái)創(chuàng)建URL對(duì)象,都可以使用這些方法來(lái)對(duì)象,都可以使用這些方法來(lái)獲取該獲取該URL對(duì)象的信息。例對(duì)象的信息。例11.1描述了描述了URL類(lèi)的基本類(lèi)的基本用法。用法。例例 URL類(lèi)的基本用法舉例。類(lèi)的基本用法舉例。import .URL; /引入引入U(xiǎn)RL類(lèi)類(lèi)import .MalformedUR

28、LException; /引入引入包中的異常類(lèi)包中的異常類(lèi)class URLDemo public static void main(String args) URL sampleURL = null; try sampleURL = new URL(http:/:80/index.html#down); /創(chuàng)建創(chuàng)建URL對(duì)象對(duì)象 catch(MalformedURLException e) /異常處理異常處理 e.printStackTrace(); /顯示顯示sampleURL對(duì)象的各屬性值對(duì)象的各屬性值 System.out.println(協(xié)議:協(xié)議: +sampleURL.getPr

29、otocol(); System.out.println(主機(jī)名:主機(jī)名:+sampleURL.getHost(); System.out.println(端口號(hào):端口號(hào):+sampleURL.getPort(); System.out.println(文件名:文件名:+sampleURL.getFile(); System.out.println(錨點(diǎn):錨點(diǎn): +sampleURL.getRef(); 這是一個(gè)這是一個(gè)Java應(yīng)用程序。運(yùn)行結(jié)果輸出應(yīng)用程序。運(yùn)行結(jié)果輸出URL地址的各地址的各屬性值,因?yàn)閷傩灾?,因?yàn)閁RL沒(méi)有參考點(diǎn),輸出為沒(méi)有參考點(diǎn),輸出為null。運(yùn)行結(jié)。運(yùn)行結(jié)果為:果為:

30、協(xié)議:協(xié)議: http主機(jī)名:主機(jī)名:端口號(hào):端口號(hào):80文件名:文件名:/index.html錨點(diǎn):錨點(diǎn): down獲取圖像獲取圖像 Java Applet可以直接從網(wǎng)絡(luò)上結(jié)點(diǎn)獲取圖像并可以直接從網(wǎng)絡(luò)上結(jié)點(diǎn)獲取圖像并顯示出來(lái)。顯示出來(lái)。 為了了解其編程方法和從本地顯示為了了解其編程方法和從本地顯示圖像的編程有何不同,先不考慮網(wǎng)絡(luò)功能,來(lái)圖像的編程有何不同,先不考慮網(wǎng)絡(luò)功能,來(lái)看一個(gè)以前學(xué)習(xí)過(guò)的簡(jiǎn)單的圖像顯示的例子:看一個(gè)以前學(xué)習(xí)過(guò)的簡(jiǎn)單的圖像顯示的例子: 例例11.2 獲取并顯示圖像舉例。獲取并顯示圖像舉例。import java.applet.*;import java.awt.*;pub

31、lic class Li11_02 extends Applet Image image; public void init() image=getImage(getDocumentBase(),swan.gif); public void paint(Graphics g) g.drawImage(image, 0, 0,this); 這是一個(gè)獲取并顯示圖像的簡(jiǎn)單例子,在該例這是一個(gè)獲取并顯示圖像的簡(jiǎn)單例子,在該例中,先用中,先用getImage()方法從方法從HTML文檔所在位文檔所在位置調(diào)用圖像置調(diào)用圖像swan.gif,并由此生成一個(gè),并由此生成一個(gè)Image類(lèi)類(lèi)型的對(duì)象型的對(duì)象ima

32、ge,然后用,然后用drawImage(image,0,0,this)在屏幕上將圖像顯在屏幕上將圖像顯示出來(lái)。示出來(lái)。 如果想從網(wǎng)絡(luò)上其他結(jié)點(diǎn)獲取圖像,關(guān)鍵是創(chuàng)如果想從網(wǎng)絡(luò)上其他結(jié)點(diǎn)獲取圖像,關(guān)鍵是創(chuàng)建對(duì)應(yīng)于網(wǎng)絡(luò)上其他結(jié)點(diǎn)的建對(duì)應(yīng)于網(wǎng)絡(luò)上其他結(jié)點(diǎn)的Image類(lèi)型的對(duì)象,類(lèi)型的對(duì)象,一旦獲得一旦獲得Image類(lèi)型的對(duì)象,便可以對(duì)其進(jìn)行類(lèi)型的對(duì)象,便可以對(duì)其進(jìn)行任何可能的圖像操作。任何可能的圖像操作。Java提供了提供了getImage(new URL(字符串字符串)方法可以創(chuàng)建對(duì)應(yīng)方法可以創(chuàng)建對(duì)應(yīng)于其他結(jié)點(diǎn)的圖像于其他結(jié)點(diǎn)的圖像,其使用格式可有兩種:其使用格式可有兩種: String url =

33、 結(jié)點(diǎn)結(jié)點(diǎn)URL; Image image; try image = getImage(new URL(url); catch(Exception e)System.out.println(不能打開(kāi)這個(gè)不能打開(kāi)這個(gè)URL地址地址 ); 或或URL imgur = null;Image image;try imgur = new URL(結(jié)點(diǎn)結(jié)點(diǎn)URL ); catch (MalformedURLException e) System.out.println(不能打開(kāi)這個(gè)不能打開(kāi)這個(gè)URL地址地址 ); image=getImage(imgur); 前一種格式用前一種格式用“new URL(ur

34、l)”生成生成URL對(duì)象,并直對(duì)象,并直接作為接作為getImage的參數(shù),后一種格式先用的參數(shù),后一種格式先用“new URL(url)”生成一個(gè)生成一個(gè) URL對(duì)象,再傳給對(duì)象,再傳給getImage。兩。兩種格式本質(zhì)上是一樣的。兩種格式中,生成種格式本質(zhì)上是一樣的。兩種格式中,生成URL對(duì)象對(duì)象的部分都包含在的部分都包含在try/獲取獲取URL對(duì)象對(duì)象 catch (MalformedURLException e) /出錯(cuò)提示出錯(cuò)提示 之中。之中。 例如要調(diào)用例如要調(diào)用/java/automain.jpg結(jié)點(diǎn)結(jié)點(diǎn)的圖像,第一種格式的完整實(shí)現(xiàn)見(jiàn)例的圖像

35、,第一種格式的完整實(shí)現(xiàn)見(jiàn)例11.3源程序。第源程序。第二種格式的完整實(shí)現(xiàn)見(jiàn)例二種格式的完整實(shí)現(xiàn)見(jiàn)例11.4的源代碼。說(shuō)明:例的源代碼。說(shuō)明:例11.3至至11.8編譯后需要把編譯后需要把.class文件和相應(yīng)的文件和相應(yīng)的.htm文件放入文件放入站點(diǎn)中的相應(yīng)虛擬目錄才可顯示出效果。對(duì)于沒(méi)有服站點(diǎn)中的相應(yīng)虛擬目錄才可顯示出效果。對(duì)于沒(méi)有服務(wù)器或不能上網(wǎng)的讀者,也可以在自己的計(jì)算機(jī)上通務(wù)器或不能上網(wǎng)的讀者,也可以在自己的計(jì)算機(jī)上通過(guò)安裝微軟的過(guò)安裝微軟的IIS或或PWS(Windows98用戶)建立一臺(tái)用戶)建立一臺(tái)WEB服務(wù)器進(jìn)行測(cè)試,服務(wù)器建立后,把上面的程序服務(wù)器進(jìn)行測(cè)試,服務(wù)器建立后,把上

36、面的程序放入放入WEB服務(wù)器相應(yīng)目錄中,然后把例題中的域名換服務(wù)器相應(yīng)目錄中,然后把例題中的域名換成成即可。即可。 例例11.3 顯示網(wǎng)絡(luò)結(jié)點(diǎn)上的圖像。顯示網(wǎng)絡(luò)結(jié)點(diǎn)上的圖像。/Li11_03.javaimport java.applet.*;import .*;import java.awt.*;public class Li11_03 extends Applet Image image; public void init() String url=/java/automain.jpg;/請(qǐng)按請(qǐng)按實(shí)際情況更改站點(diǎn)的域名實(shí)際情

37、況更改站點(diǎn)的域名 try image = getImage(new URL(url); catch(Exception e) public void paint(Graphics g) g.drawImage(image, 0, 0,this); 例例11.4 顯示網(wǎng)絡(luò)結(jié)點(diǎn)上的圖像。顯示網(wǎng)絡(luò)結(jié)點(diǎn)上的圖像。/Li11_04.javaimport java.applet.*;import .*;import java.awt.*;public class Li11_04 extends Applet Image image; URL imgur=null; public void init() t

38、ry imgur=new URL(/java/automain.jpg);/請(qǐng)按實(shí)請(qǐng)按實(shí)際情況更改站點(diǎn)的域名際情況更改站點(diǎn)的域名 catch (MalformedURLException e) System.out.println(不能打開(kāi)該不能打開(kāi)該URL地址。地址。); image=getImage(imgur); public void paint(Graphics g) g.drawImage(image, 0, 0,this); 將上述兩個(gè)程序分別以將上述兩個(gè)程序分別以Li11_03.java和和Li11_04. java存盤(pán)并把存盤(pán)并把URL地

39、址更改為自己服務(wù)器的圖地址更改為自己服務(wù)器的圖像文件的地址,執(zhí)行像文件的地址,執(zhí)行javac Li11_03.java和和javac L i 11 _ 0 4 . j a v a , 將 得 到 編 譯 后 生 成 的, 將 得 到 編 譯 后 生 成 的Li11_03.class和和Li11_04.class,最后創(chuàng)建調(diào)用這,最后創(chuàng)建調(diào)用這兩個(gè)兩個(gè)Java Applet的的HTML文檔。文檔。 將將 . c l a s s 和和 . h t m 程 序 放 入程 序 放 入 We b 服 務(wù) 器服 務(wù) 器()并用并用IE打開(kāi),便可以看到打開(kāi),便可以看到Java Ap

40、plet 所顯示的從網(wǎng)絡(luò)上獲得的圖像了。不過(guò),所顯示的從網(wǎng)絡(luò)上獲得的圖像了。不過(guò),在在Applet程序中一般很少采用絕對(duì)程序中一般很少采用絕對(duì)URL,因?yàn)?,因?yàn)槌鲇诎踩缘目紤],瀏覽器只允許出于安全性的考慮,瀏覽器只允許Applet訪問(wèn)訪問(wèn)與與Applet同一主機(jī)的資源。如果采用絕對(duì)同一主機(jī)的資源。如果采用絕對(duì)URL,則當(dāng)則當(dāng)Applet放到其他的放到其他的Web服務(wù)器上運(yùn)行時(shí),服務(wù)器上運(yùn)行時(shí),必須修改程序。必須修改程序。獲取聲音獲取聲音 Java從網(wǎng)絡(luò)上獲取聲音文件并播放聲音的編程從網(wǎng)絡(luò)上獲取聲音文件并播放聲音的編程方法有兩種,第一種是利用方法有兩種,第一種是利用Java提供的提供的play

41、(URL1)及及play(URL1,String1) 直接播放網(wǎng)直接播放網(wǎng)絡(luò) 上 的 聲 音 文 件 , 另 一 種 是 通 過(guò)絡(luò) 上 的 聲 音 文 件 , 另 一 種 是 通 過(guò)getAudioClip(URL)或或getAudioClip(URL, String)先從網(wǎng)絡(luò)上獲取聲音文件,并生成先從網(wǎng)絡(luò)上獲取聲音文件,并生成AudioClip 類(lèi)型的對(duì)象,然后對(duì)該對(duì)象進(jìn)行操類(lèi)型的對(duì)象,然后對(duì)該對(duì)象進(jìn)行操作。第一種方法實(shí)現(xiàn)可以用如下代碼:作。第一種方法實(shí)現(xiàn)可以用如下代碼:String Audur = 結(jié)點(diǎn)結(jié)點(diǎn)URL;try play(new URL(Audur); /或或play(new U

42、RL(Audur),聲聲音文件名音文件名); catch(Exception e) 第二種方法實(shí)現(xiàn)可以用如下代碼:第二種方法實(shí)現(xiàn)可以用如下代碼:String Audur = 結(jié)點(diǎn)結(jié)點(diǎn)URL;AudioClip loopClip;try loopClip = getAudioClip(new URL(Audur); /或或loopClip = getAudioClip(new URL(Audur) ,聲音文件名聲音文件名); catch(Exception e)System.out.println(不能打開(kāi)這個(gè)不能打開(kāi)這個(gè)URL地址。地址。); 上面的兩種格式都是將生成上面的兩種格式都是將生成U

43、RL對(duì)象部分對(duì)象部分“new URL(url)”直接作為直接作為play或或getAudioClip的參數(shù);和前面處理圖像的例子一樣,也可以的參數(shù);和前面處理圖像的例子一樣,也可以先用先用“new URL(url)”獲取一個(gè)獲取一個(gè)URL對(duì)象,再對(duì)象,再傳給傳給 play 或或getAudioClip。如對(duì)第一種。如對(duì)第一種play(URL)的格式,也可采用如下的編程格式:的格式,也可采用如下的編程格式:URL Audur =null;try Audur=new URL(結(jié)點(diǎn)結(jié)點(diǎn)URL ); catch(Exception e)System.out.println(不能打開(kāi)該不能打開(kāi)該URL地

44、址。地址。);play(Audur);獲取文檔獲取文檔 利用利用Java提供的提供的getAppletContext().showDoc ument()方法可以顯示方法可以顯示W(wǎng)eb服務(wù)器結(jié)點(diǎn)的服務(wù)器結(jié)點(diǎn)的HTML文檔,在調(diào)用這個(gè)方法之前首先需要指文檔,在調(diào)用這個(gè)方法之前首先需要指定文檔的網(wǎng)絡(luò)資源的定文檔的網(wǎng)絡(luò)資源的URL。其兩種格式如下:。其兩種格式如下:void showDocument(URL url);void showDocument(URL url, String target); 第一種格式在當(dāng)前窗口中打開(kāi)指定的網(wǎng)頁(yè)文件,第一種格式在當(dāng)前窗口中打開(kāi)指定的網(wǎng)頁(yè)文件,第二種格式在指定

45、的窗口中打開(kāi)指定的網(wǎng)頁(yè)文第二種格式在指定的窗口中打開(kāi)指定的網(wǎng)頁(yè)文件。同前面的顯示網(wǎng)絡(luò)上其他結(jié)點(diǎn)的資源一樣,件。同前面的顯示網(wǎng)絡(luò)上其他結(jié)點(diǎn)的資源一樣,獲取文檔也有兩種編程方式,例獲取文檔也有兩種編程方式,例11.7和例和例11.8分別演示了分別演示了showDocument()方法的使用。方法的使用。 例例11.7 獲取并顯示網(wǎng)絡(luò)結(jié)點(diǎn)上的文檔資源。獲取并顯示網(wǎng)絡(luò)結(jié)點(diǎn)上的文檔資源。import java.applet.*;import java.awt.*;import .*;public class Li11_07 extends Applet URL docur= null; public v

46、oid paint(Graphics g) try docur=new URL(/java/index.htm); /請(qǐng)根據(jù)實(shí)際情況更改站點(diǎn)域名請(qǐng)根據(jù)實(shí)際情況更改站點(diǎn)域名 catch (MalformedURLException e) System.out.println(不能打開(kāi)該不能打開(kāi)該URL地址。地址。); if (docur != null) getAppletContext().showDocument(docur); 例例11.8 獲取并顯示網(wǎng)絡(luò)結(jié)點(diǎn)上的文檔資源。獲取并顯示網(wǎng)絡(luò)結(jié)點(diǎn)上的文檔資源。import java.applet.*;imp

47、ort java.awt.*;import .*;public class Li11_08 extends Applet URL docur= null; public void paint(Graphics g) try getAppletContext().showDocument(new URL(/java/index.htm); catch (MalformedURLException e) System.out.println(不能打開(kāi)該不能打開(kāi)該URL地址。地址。); /paint()上面的兩個(gè)程序只是利用上面的兩個(gè)程序只是利用showDocm

48、ent()方法方法顯示網(wǎng)上的顯示網(wǎng)上的HTML文檔,但并不能對(duì)其內(nèi)容文檔,但并不能對(duì)其內(nèi)容進(jìn)行處理。實(shí)際上,進(jìn)行處理。實(shí)際上,Java還可以讀取網(wǎng)絡(luò)上還可以讀取網(wǎng)絡(luò)上文件的內(nèi)容,并對(duì)其內(nèi)容進(jìn)行處理。文件的內(nèi)容,并對(duì)其內(nèi)容進(jìn)行處理。Java讀取并處理網(wǎng)絡(luò)上文件內(nèi)容的步驟如下:讀取并處理網(wǎng)絡(luò)上文件內(nèi)容的步驟如下:(1)創(chuàng)建一個(gè)創(chuàng)建一個(gè)URL類(lèi)型的對(duì)象。例如:類(lèi)型的對(duì)象。例如: URL fileurl = new URL(url);(2)利用利用URL類(lèi)的類(lèi)的openStream( )方法獲得對(duì)應(yīng)的方法獲得對(duì)應(yīng)的InputStream類(lèi)的對(duì)象。例如:類(lèi)的對(duì)象。例如: InputStream file

49、con = fileurl.openStream( );(3)將將InputStream對(duì)象轉(zhuǎn)化為對(duì)象轉(zhuǎn)化為DataInput Stream類(lèi)的對(duì)象。例如:類(lèi)的對(duì)象。例如: DataInputStream filedata = new DataInputStream(filecon);(4)讀取內(nèi)容并處理。例如,對(duì)上面的讀取內(nèi)容并處理。例如,對(duì)上面的filedata,可用,可用filedata.readLine一行一一行一行讀取內(nèi)容或用行讀取內(nèi)容或用filedata.readchar一個(gè)一個(gè)字符一個(gè)字符地讀取,讀取后可使用字符一個(gè)字符地讀取,讀取后可使用java語(yǔ)句對(duì)其進(jìn)行處理并輸出。語(yǔ)句對(duì)其

50、進(jìn)行處理并輸出。對(duì)于讀取并處理網(wǎng)上對(duì)于讀取并處理網(wǎng)上HTML文件內(nèi)容的文件內(nèi)容的程序,請(qǐng)讀者根據(jù)以上說(shuō)明步驟,自己程序,請(qǐng)讀者根據(jù)以上說(shuō)明步驟,自己編寫(xiě)一個(gè)小程序。編寫(xiě)一個(gè)小程序。11.3 使用使用TCP協(xié)議的協(xié)議的Socket編程編程 Socket套接字套接字 對(duì)于超出了對(duì)于超出了URL類(lèi)所提供的連網(wǎng)應(yīng)用程序,類(lèi)所提供的連網(wǎng)應(yīng)用程序,Java提供了套接口類(lèi)(提供了套接口類(lèi)(Socket)和服務(wù)套接口)和服務(wù)套接口類(lèi)(類(lèi)(ServerSocket)作為標(biāo)準(zhǔn)的)作為標(biāo)準(zhǔn)的TCP套接口編套接口編程技術(shù),通過(guò)它們可以實(shí)現(xiàn)主機(jī)與主機(jī)之間的程技術(shù),通過(guò)它們可以實(shí)現(xiàn)主機(jī)與主機(jī)之間的對(duì)話。對(duì)話。 使用使用S

51、ocket進(jìn)行進(jìn)行Client/Server程序設(shè)計(jì)的一般程序設(shè)計(jì)的一般連接過(guò)程是這樣的:連接過(guò)程是這樣的:Server端端Listen(監(jiān)聽(tīng)監(jiān)聽(tīng))某個(gè)某個(gè)端口是否有連接請(qǐng)求,端口是否有連接請(qǐng)求,Client端向端向Server端發(fā)端發(fā)出出Connect(連接連接)請(qǐng)求,請(qǐng)求,Server端向端向Client端發(fā)端發(fā)回回Accept(接受)消息,一個(gè)連接就建立起來(lái)(接受)消息,一個(gè)連接就建立起來(lái)了。了。Server端和端和Client端都可以通過(guò)套接口類(lèi)端都可以通過(guò)套接口類(lèi)提供的一些方法與對(duì)方通信。提供的一些方法與對(duì)方通信。 對(duì)于一個(gè)功能齊全的對(duì)于一個(gè)功能齊全的Socket,都要包含,都要包含

52、以下基本結(jié)構(gòu),其工作過(guò)程包含以下四以下基本結(jié)構(gòu),其工作過(guò)程包含以下四個(gè)基本的步驟:個(gè)基本的步驟:1.創(chuàng)建創(chuàng)建Socket;2.打開(kāi)連接到打開(kāi)連接到Socket的輸入的輸入/輸出流;輸出流;3.按照一定的協(xié)議對(duì)按照一定的協(xié)議對(duì)Socket進(jìn)行讀進(jìn)行讀/寫(xiě)操作;寫(xiě)操作;4.關(guān)閉關(guān)閉Socket。 Java在在包中提供了兩個(gè)類(lèi)包中提供了兩個(gè)類(lèi)Socket和和ServerSocket,分別用來(lái)表示雙向連接,分別用來(lái)表示雙向連接的客戶端和服務(wù)端創(chuàng)建、管理通信。這的客戶端和服務(wù)端創(chuàng)建、管理通信。這是兩個(gè)封裝得非常好的類(lèi),使用很方便。是兩個(gè)封裝得非常好的類(lèi),使用很方便。其構(gòu)造方法如下:其構(gòu)造方法如下: So

53、cket(); Socket(InetAddress address, int port); Socket(InetAddress address, int port, boolean stream); Socket(String host, int prot); Socket(String host, int prot, boolean stream); Socket(SocketImpl impl); Socket(String host, int port, InetAddress localAddr, int localPort); Socket(InetAddress address

54、, int port, InetAddress localAddr, int localPort); ServerSocket(); ServerSocket(int port); ServerSocket(int port, int backlog); ServerSocket(int port, int backlog, InetAddress bindAddr); 其中其中address、host和和port分別是雙向連分別是雙向連接中一方的接中一方的IP地址、主機(jī)名和端口號(hào),地址、主機(jī)名和端口號(hào),stream指明指明socket是流是流socket還是數(shù)據(jù)報(bào)還是數(shù)據(jù)報(bào)socket,lo

55、calPort表示本地主機(jī)的端口號(hào),表示本地主機(jī)的端口號(hào),localAddr和和bindAddr是本地機(jī)器的地址是本地機(jī)器的地址(ServerSocket的主機(jī)地址),的主機(jī)地址),impl是是s o c k e t 的 父 類(lèi) , 既 可 以 用 來(lái) 創(chuàng) 建的 父 類(lèi) , 既 可 以 用 來(lái) 創(chuàng) 建serverSocket又可以用來(lái)創(chuàng)建又可以用來(lái)創(chuàng)建Socket。例。例如:如:Socket client = new Socket(127.0.01., 8088);ServerSocket server = new ServerSocket(8088); 注意:在選擇端口時(shí),必須小心。每一個(gè)端

56、口注意:在選擇端口時(shí),必須小心。每一個(gè)端口提供一種特定的服務(wù),只有給出正確的端口,提供一種特定的服務(wù),只有給出正確的端口,才能獲得相應(yīng)的服務(wù)。才能獲得相應(yīng)的服務(wù)。01023的端口號(hào)為系統(tǒng)的端口號(hào)為系統(tǒng)所保留,例如所保留,例如http服務(wù)的端口號(hào)為服務(wù)的端口號(hào)為80,telnet服服務(wù)的端口號(hào)為務(wù)的端口號(hào)為21,ftp服務(wù)的端口號(hào)為服務(wù)的端口號(hào)為23, 所以在所以在選擇端口號(hào)時(shí),最好選擇一個(gè)大于選擇端口號(hào)時(shí),最好選擇一個(gè)大于1023的數(shù)以的數(shù)以防止發(fā)生沖突。防止發(fā)生沖突。 在創(chuàng)建在創(chuàng)建socket時(shí)如果發(fā)生錯(cuò)誤 , 將 產(chǎn) 生時(shí)如果發(fā)生錯(cuò)誤 , 將 產(chǎn) 生IOException,在程序中必須對(duì)之

57、做出處理。,在程序中必須對(duì)之做出處理。所以在創(chuàng)建所以在創(chuàng)建Socket或或ServerSocket是必須捕獲是必須捕獲或拋出例外。或拋出例外。 在使用在使用Socket和和ServerSocket類(lèi)構(gòu)造完對(duì)象后,類(lèi)構(gòu)造完對(duì)象后,就可以使用它們提供的方法來(lái)實(shí)現(xiàn)端口的套接就可以使用它們提供的方法來(lái)實(shí)現(xiàn)端口的套接等功能。其中等功能。其中Socket類(lèi)提供的主要方法有以下類(lèi)提供的主要方法有以下幾種:幾種: getInputStream():返回此套接口鏈接地址的輸入:返回此套接口鏈接地址的輸入流。流。 getInetAddress():返回此套接口鏈接的地址對(duì)象。:返回此套接口鏈接的地址對(duì)象。 get

58、LocalAddress():返回套接口本地的地址對(duì)象。:返回套接口本地的地址對(duì)象。 getLocalPort():返回套接口本地的地址端口。:返回套接口本地的地址端口。 getOutputStream():返回此套接口鏈接地址的輸出:返回此套接口鏈接地址的輸出流。流。 getPort():返回此套接口鏈接地址的端口。:返回此套接口鏈接地址的端口。 setSoTimeOut():設(shè)置套接口的有效期限值。:設(shè)置套接口的有效期限值。 toString():返回套接口字符串。:返回套接口字符串。 close():關(guān)閉套接口。:關(guān)閉套接口。 isClosed():判斷此套接口是否關(guān)閉。:判斷此套接口是

59、否關(guān)閉。 isConnected():判斷此套接口是否斷開(kāi)。:判斷此套接口是否斷開(kāi)。 shutdownInput():關(guān)閉套接口的輸入流。:關(guān)閉套接口的輸入流。 shutdownOutput():關(guān)閉套接口的輸出流。:關(guān)閉套接口的輸出流。 ServerSocket類(lèi)提供的主要方法有以下幾種:類(lèi)提供的主要方法有以下幾種: accept():返回與服務(wù)器端建立連接的機(jī)器套接口。:返回與服務(wù)器端建立連接的機(jī)器套接口。 getChannel():返回服務(wù)套接口通道。:返回服務(wù)套接口通道。 getInetAddress():返回本機(jī)的地址對(duì)象。:返回本機(jī)的地址對(duì)象。 getLocalPort():返回服

60、務(wù)器所綁定的監(jiān)聽(tīng)端口號(hào)。:返回服務(wù)器所綁定的監(jiān)聽(tīng)端口號(hào)。 getSoTimeout():返回服務(wù)套接口限制的時(shí)間數(shù)。:返回服務(wù)套接口限制的時(shí)間數(shù)。 setSoTimeout(int timeout):設(shè)定服務(wù)套接口所需:設(shè)定服務(wù)套接口所需等到的時(shí)間限度。等到的時(shí)間限度。 toString():返回服務(wù)套接口字符串。:返回服務(wù)套接口字符串。 close():關(guān)閉服務(wù)套接口。:關(guān)閉服務(wù)套接口。 isClosed():判斷服務(wù)套接口是否關(guān)閉。:判斷服務(wù)套接口是否關(guān)閉。一對(duì)一的一對(duì)一的Socket C/S通信通信 TCP是一種可靠的、基于連接的網(wǎng)絡(luò)協(xié)議,在是一種可靠的、基于連接的網(wǎng)絡(luò)協(xié)議,在Inter

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論