Java網(wǎng)絡(luò)程序設(shè)計(jì) 課件 單元9 Socket編程_第1頁(yè)
Java網(wǎng)絡(luò)程序設(shè)計(jì) 課件 單元9 Socket編程_第2頁(yè)
Java網(wǎng)絡(luò)程序設(shè)計(jì) 課件 單元9 Socket編程_第3頁(yè)
Java網(wǎng)絡(luò)程序設(shè)計(jì) 課件 單元9 Socket編程_第4頁(yè)
Java網(wǎng)絡(luò)程序設(shè)計(jì) 課件 單元9 Socket編程_第5頁(yè)
已閱讀5頁(yè),還剩68頁(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)介

計(jì)算網(wǎng)絡(luò)基礎(chǔ)單元九主要功能和分類

網(wǎng)絡(luò)協(xié)議網(wǎng)絡(luò)分層模型目錄CONTENTS123數(shù)據(jù)封裝和解封目錄CONTENTS5

TCP/IP協(xié)議簡(jiǎn)介49.1.1主要功能和分類

計(jì)算機(jī)網(wǎng)絡(luò)是將地理位置不同的具有獨(dú)立功能的多臺(tái)計(jì)算機(jī)及其外部設(shè)備,通過(guò)通信線路連接起來(lái),在網(wǎng)絡(luò)操作系統(tǒng),網(wǎng)絡(luò)管理軟件及網(wǎng)絡(luò)通信協(xié)議的管理和協(xié)調(diào)下,實(shí)現(xiàn)資源共享和信息傳遞的計(jì)算機(jī)系統(tǒng)。如果按照地理范圍劃分,可以將計(jì)算機(jī)網(wǎng)絡(luò)分為局域網(wǎng)、城域網(wǎng)和廣域網(wǎng)三種。

局域網(wǎng)(LocalAreaNetwork,LAN)是在一個(gè)局部的地理范圍內(nèi)(如一個(gè)企業(yè)、一個(gè)學(xué)校或一個(gè)網(wǎng)吧),一般是方圓幾千米以內(nèi),將各種計(jì)算機(jī)、服務(wù)器、外部設(shè)備等互相連接起來(lái)組成的計(jì)算機(jī)通信網(wǎng)。局域網(wǎng)可以實(shí)現(xiàn)文件管理、軟件共享、打印機(jī)共享等功能。從嚴(yán)格意義上來(lái)講,局域網(wǎng)應(yīng)該是封閉型的,它可以由幾臺(tái)甚至成千上萬(wàn)臺(tái)計(jì)算機(jī)組成,但實(shí)際上,局域網(wǎng)可以通過(guò)廣域網(wǎng)或?qū)>€與遠(yuǎn)方的局域網(wǎng)、服務(wù)器相連接,拓展網(wǎng)絡(luò)范圍或?qū)崿F(xiàn)更多的功能。9.1.1主要功能和分類

城域網(wǎng)(MetropolitanAreaNetwork,MAN)一般來(lái)說(shuō)是在一個(gè)城市,連接距離在10?100公里范圍內(nèi)的計(jì)算機(jī)互聯(lián)網(wǎng)。MAN與LAN相比擴(kuò)展的距離更長(zhǎng),連接的計(jì)算機(jī)數(shù)量更多,在地理范圍上MAN網(wǎng)絡(luò)可以說(shuō)是LAN網(wǎng)絡(luò)的延伸。在一個(gè)大型城市或都市地區(qū),一個(gè)MAN網(wǎng)絡(luò)通常連接著多個(gè)LAN,如連接政府機(jī)構(gòu)的LAN、醫(yī)院的LAN、電信的LAN、公司企業(yè)的LAN等。另外由于光纖連接的引入,使MAN中高速的LAN互聯(lián)成為可能。

廣域網(wǎng)(WideAreaNetwork,_WAN)也稱為遠(yuǎn)程網(wǎng),所覆蓋的范圍比城域網(wǎng)更廣,起到LAN或MAN之間的網(wǎng)絡(luò)互聯(lián)的作用。廣域網(wǎng)能連接多個(gè)城市或國(guó)家,或橫跨幾個(gè)洲并能提供遠(yuǎn)距離通信,形成國(guó)際性的遠(yuǎn)程網(wǎng)絡(luò),互聯(lián)網(wǎng)是世界范圍內(nèi)最大的廣域網(wǎng)。因?yàn)榫嚯x較遠(yuǎn),信息衰減嚴(yán)重,所以這種網(wǎng)絡(luò)一般要使用專線,構(gòu)成網(wǎng)狀結(jié)構(gòu),解決信息安全到達(dá)的問(wèn)題。

。9.1.2網(wǎng)絡(luò)協(xié)議

上面我們按照地理范圍將計(jì)算機(jī)網(wǎng)絡(luò)劃分為局域網(wǎng)、城域網(wǎng)和廣域網(wǎng),在實(shí)際工作中,常提到的是局域網(wǎng)和互聯(lián)網(wǎng)(廣域網(wǎng)),城域網(wǎng)較少被提及。在人類社會(huì)中,人與人之間的交流是通過(guò)各種語(yǔ)言來(lái)實(shí)現(xiàn)的。為什么你說(shuō)的話我可以聽(tīng)明白,原因在于你是按照漢語(yǔ)的規(guī)則說(shuō)話,而我也懂漢語(yǔ)的規(guī)則,所以可以聽(tīng)懂你的意思。網(wǎng)絡(luò)協(xié)議就是為計(jì)算機(jī)網(wǎng)絡(luò)中進(jìn)行數(shù)據(jù)交換而建立的規(guī)則、標(biāo)準(zhǔn)或約定的集合。網(wǎng)絡(luò)協(xié)議通常由三個(gè)要素組成:

(1)語(yǔ)義,規(guī)定了通信雙方為了完成某種目的,需要發(fā)出何種控制信息以及基于這個(gè)信息需要做出何種行動(dòng)。例如A處民宅發(fā)生火災(zāi),需要向B處城市報(bào)警臺(tái)報(bào)警,則A發(fā)送“119+民宅地址”的信息給B,B獲得這個(gè)信息后根據(jù)119知道是火警,則通知消防隊(duì)去民宅地址滅火。

(2)語(yǔ)法,是用戶數(shù)據(jù)與控制信息的結(jié)構(gòu)與格式,以及數(shù)據(jù)出現(xiàn)的先后順序。例如,語(yǔ)法可以規(guī)定A向B發(fā)送的數(shù)據(jù)前部是“119”,后部是“民宅地址”。9.1.2網(wǎng)絡(luò)協(xié)議 (3)時(shí)序,是對(duì)事件發(fā)生順序的詳細(xì)說(shuō)明。比如何時(shí)進(jìn)行通信,先講什么,后講什么,講話的速度等。

這三個(gè)要素可以描述為:語(yǔ)義表示要做什么,語(yǔ)法表示要怎么做,時(shí)序表示做的順序。在計(jì)算機(jī)網(wǎng)絡(luò)中,由于計(jì)算機(jī)、網(wǎng)絡(luò)設(shè)備之間聯(lián)系很復(fù)雜,在制定協(xié)議時(shí)為了減少網(wǎng)絡(luò)設(shè)計(jì)的復(fù)雜性,絕大多數(shù)網(wǎng)絡(luò)釆用分層設(shè)計(jì)方法。所謂分層設(shè)計(jì)方法,就是按照信息的流動(dòng)過(guò)程將網(wǎng)絡(luò)的整體功能分解為一個(gè)個(gè)的功能層,不同機(jī)器上的同等功能層之間采用相同的協(xié)議,同—機(jī)器上的相鄰功能層之間通過(guò)接口進(jìn)行信息傳遞。在不同的網(wǎng)絡(luò)中,分層數(shù)量、各層的名稱和功能以及協(xié)議都各不相同。然而,在所有的網(wǎng)絡(luò)中,每一層的目的都是向它的上一層提供一定的服務(wù),同時(shí)也向下一層獲取一定的服務(wù)。9.1.2網(wǎng)絡(luò)協(xié)議

分層設(shè)計(jì)方法首先確定層次及每層應(yīng)完成的任務(wù),確定層次時(shí)應(yīng)按邏輯組成功能細(xì)化層次,使得每層功能相對(duì)單一,易于處理。但同時(shí)層次也不能太多,否則會(huì)因?yàn)閷哟沃g的處理產(chǎn)生過(guò)多的開(kāi)銷。將整個(gè)網(wǎng)絡(luò)通信功能劃分為垂直的層次后,在通信過(guò)程中下層將向上層隱蔽下層的實(shí)現(xiàn)細(xì)節(jié),而上層也只按接口要求獲取信息,這樣各層之間即獨(dú)立同時(shí)也能順利傳遞信息。

9.1.3網(wǎng)絡(luò)分層模型

為了使不同計(jì)算機(jī)廠家生產(chǎn)的計(jì)算機(jī)能夠相互通信,以便在更大的范圍內(nèi)建立計(jì)算機(jī)網(wǎng)絡(luò),國(guó)際標(biāo)準(zhǔn)化組織(ISO)在1978年提出了“開(kāi)放式系統(tǒng)互聯(lián)參考模型”,即著名的OSI/RM模型(OpenSystemInterconnection/ReferenceModel)。它將計(jì)算機(jī)網(wǎng)絡(luò)體系結(jié)構(gòu)的通信協(xié)議劃分為七層,自下而上依次為物理層(PhysicsLayer)、數(shù)據(jù)鏈路層(DataLinkLayer)、網(wǎng)絡(luò)層(NetworkLayer)、傳輸層(TransportLayer)、會(huì)話層(SessionLayer)、表示層(PresentationLayer)、應(yīng)用層(ApplicationLayer)。對(duì)于每一層,至少制定兩項(xiàng)標(biāo)準(zhǔn):服務(wù)定義和協(xié)議規(guī)范。前者給出了該層所提供的服務(wù)的準(zhǔn)確定義,后者詳細(xì)描述了該協(xié)議的動(dòng)作和各種有關(guān)規(guī)程,以保證服務(wù)的提供。9.1.3網(wǎng)絡(luò)分層模型 TCP/IP協(xié)議不是TCP和IP這兩個(gè)協(xié)議的合稱,而是指整個(gè)TCP/IP協(xié)議族。TCP/IP協(xié)議是互聯(lián)網(wǎng)的基礎(chǔ)協(xié)議,沒(méi)有它就根本不可能上網(wǎng),任何和互聯(lián)網(wǎng)有關(guān)的操作都離不開(kāi)TCP/IP協(xié)議。TCP/IP協(xié)議定義了電子設(shè)備如何連入因特網(wǎng),以及數(shù)據(jù)如何在它們之間傳輸?shù)臉?biāo)準(zhǔn)。協(xié)議釆用了四層(另一說(shuō)法為五層)的層次結(jié)構(gòu),自下而上依次為網(wǎng)絡(luò)接口層(NetworkInterfaceLayer)、網(wǎng)絡(luò)層(NetworkLayer)、傳輸層(TransportLayer)和應(yīng)用層(ApplicationLayer)。 TCP/IP協(xié)議并不完全符合OSI的七層參考模型,OSI是傳統(tǒng)的開(kāi)放式系統(tǒng)互聯(lián)參考模型,是一種通信協(xié)議的七層抽象的參考模型,其中每一層執(zhí)行某一特定任務(wù)。該模型的目的是使各種硬件在相同的層次上相互通信。而TCP/IP通信協(xié)議采用了四層的層次結(jié)構(gòu),每一層都要求它的下一層按接口要求提供服務(wù)。TCP/IP協(xié)議模型與OSI參考模型的對(duì)應(yīng)關(guān)系。9.1.3網(wǎng)絡(luò)分層模型如圖9.1所示圖9.1TCP/IP協(xié)議模型與OSI參考模型9.1.4TCP/IP協(xié)議簡(jiǎn)介●網(wǎng)絡(luò)接口層 TCP/IP協(xié)議模型中網(wǎng)絡(luò)接口層對(duì)應(yīng)于OSI參考模型的物理層和數(shù)據(jù)鏈路層。其中物理層規(guī)定了物理介質(zhì)的各種特性,包括機(jī)械特性、電子特性、功能特性和規(guī)程特性,而數(shù)據(jù)鏈路層是負(fù)責(zé)接收IP數(shù)據(jù)報(bào)并通過(guò)網(wǎng)絡(luò)發(fā)送,或從網(wǎng)絡(luò)上接收物理幀再抽離出IP數(shù)據(jù)報(bào)交給網(wǎng)絡(luò)層。

在該層中,大家可能會(huì)接觸到的兩個(gè)協(xié)議是: SLIP(SerialLineInternetProtocol)協(xié)議,提供了一種在串行通信線路上封裝網(wǎng)絡(luò)層數(shù)據(jù)的簡(jiǎn)單方法,使用戶通過(guò)電話線和Modem能方便地接入TCP/IP網(wǎng)絡(luò)。PPP(PointtoPointProtocol)協(xié)議,是一種有效的點(diǎn)到點(diǎn)通信協(xié)議,可以支持多種網(wǎng)絡(luò)層協(xié)議(如IP、IPX等),支持動(dòng)態(tài)分配的IP地址,并且具有差錯(cuò)檢驗(yàn)?zāi)芰?。該協(xié)議的設(shè)計(jì)目的主要是用來(lái)通過(guò)撥號(hào)或?qū)>€方式建立點(diǎn)對(duì)點(diǎn)數(shù)據(jù)連接,使其成為各種計(jì)算機(jī)、網(wǎng)絡(luò)設(shè)備之間簡(jiǎn)單連接的一種解決方案。9.1.4TCP/IP協(xié)議簡(jiǎn)介●網(wǎng)絡(luò)層

網(wǎng)絡(luò)層對(duì)應(yīng)于OSI參考模型的網(wǎng)絡(luò)層,提供源設(shè)備和目的設(shè)備之間的信息傳輸服務(wù)。它在數(shù)據(jù)鏈路層提供的兩個(gè)相鄰端點(diǎn)之間的數(shù)據(jù)幀的傳送功能上,進(jìn)一步管理網(wǎng)絡(luò)中的數(shù)據(jù)通信,將數(shù)據(jù)設(shè)法從源端經(jīng)過(guò)若干個(gè)中間結(jié)點(diǎn)傳送到目的端,從而向傳輸層提供最基本的端到端的數(shù)據(jù)傳送服務(wù)。網(wǎng)絡(luò)層主要功能包括處理來(lái)自傳輸層的分組請(qǐng)求,收到請(qǐng)求后,檢查合法性,并將分組裝入IP數(shù)據(jù)報(bào),填充報(bào)頭,選擇去往目的設(shè)備的路徑,然后將數(shù)據(jù)報(bào)發(fā)往適當(dāng)?shù)闹虚g結(jié)點(diǎn),最終達(dá)到目的端。 TCP/IP協(xié)議族中,網(wǎng)絡(luò)層的主要協(xié)議包括: IP(InternetProtocol)協(xié)議,是網(wǎng)絡(luò)層的核心,負(fù)責(zé)在主機(jī)(含網(wǎng)絡(luò)設(shè)備)之間尋址并為數(shù)據(jù)報(bào)設(shè)定路由。9.1.4TCP/IP協(xié)議簡(jiǎn)介 IP協(xié)議是無(wú)連接的,關(guān)于是否有連接,非常類似于我們打電話(有連接的)和發(fā)短信(無(wú)連接的)。在打電話的過(guò)程中,需要為通話雙方建立一個(gè)獨(dú)占的連接,雙方可以通過(guò)撥電話號(hào)碼及聽(tīng)到鈴聲接通電話來(lái)建立一個(gè)連接會(huì)話。在連接建立以后,雙方說(shuō)的話會(huì)順序到達(dá)對(duì)方那里,對(duì)方聽(tīng)到以后會(huì)進(jìn)行回話,確認(rèn)了信息的到達(dá)。而發(fā)短信則不需要建立連接,發(fā)送出去以后,并不知道對(duì)方是否一定收到了,前后發(fā)出的短消息,在接受方那里也并不一定還按照原來(lái)的發(fā)送順序接收。 IP協(xié)議不僅是無(wú)連接的,而且是不可靠的,不能保證傳輸?shù)恼_。它總是盡最大努力傳送數(shù)據(jù)報(bào)到目的設(shè)備。在傳送過(guò)程中,可能發(fā)生丟失、次序紊亂、重復(fù)或者延遲發(fā)送,數(shù)據(jù)報(bào)被收到的時(shí)候,IP協(xié)議不需要進(jìn)行確認(rèn),同樣發(fā)生錯(cuò)誤的時(shí)候,也不進(jìn)行告知。9.1.4TCP/IP協(xié)議簡(jiǎn)介 IP協(xié)議要負(fù)責(zé)尋找到達(dá)目的設(shè)備的路由。它首先判斷目的設(shè)備地址是不是本地地址,如果是,則直接發(fā)送到本地地址。如果不是,則需要在本地的路由表中查找到達(dá)目的設(shè)備地址的路由。如果找到了這個(gè)路由,就把數(shù)據(jù)報(bào)發(fā)送到這個(gè)路由,如果沒(méi)有找到,就把數(shù)據(jù)報(bào)發(fā)送給自己的網(wǎng)關(guān),由網(wǎng)關(guān)進(jìn)行處理。ICMP(InternetControlMessageProtocol)Internet控制報(bào)文協(xié)議,它的主要作用

在于報(bào)告錯(cuò)誤,并對(duì)消息進(jìn)行控制。需要強(qiáng)調(diào)的是,Internet控制報(bào)文協(xié)議并不是讓IP協(xié)議變成一個(gè)可靠的協(xié)議,它只是在特殊情況下報(bào)告錯(cuò)誤和提供反饋。ARP(AddressResolutionProtocol)正向地址解析協(xié)議,作用是根據(jù)已知的IP地址(網(wǎng)絡(luò)地址)獲取主機(jī)(含網(wǎng)絡(luò)設(shè)備)的MAC地址(硬件地址)。 RARP(ReverseARP)反向地址解析協(xié)議,其作用正好和ARP協(xié)議的作用相反,是根據(jù)主機(jī)的MAC地址獲取該設(shè)備的IP地址。9.1.4TCP/IP協(xié)議簡(jiǎn)介

●傳輸層

傳輸層對(duì)應(yīng)于OSI參考模型的傳輸層,提供進(jìn)程之間的端到端的服務(wù)。傳輸層是TCP/IP協(xié)議族中最重要的一層,是負(fù)責(zé)總體的數(shù)據(jù)傳輸和控制的。其主要功能包括分割和重組數(shù)據(jù)并提供差錯(cuò)控制和流量控制,以到達(dá)提供可靠傳輸?shù)哪康?。為了?shí)現(xiàn)可靠的傳輸,傳輸層協(xié)議規(guī)定接收端必須發(fā)送確認(rèn)信息以確定數(shù)據(jù)達(dá)到,假如數(shù)據(jù)丟失,必須重新發(fā)送。9.1.4TCP/IP協(xié)議簡(jiǎn)介

傳輸層協(xié)議主要包括: TCP(TransmissionControlProtocol)傳輸控制協(xié)議,是一種可靠的面向連接的傳輸服務(wù)協(xié)議。在TCP/IP協(xié)議族中,TCP協(xié)議提供可靠的連接服務(wù),采用“三次握手”建立一個(gè)連接。

第一次握手:建立連接時(shí),源端發(fā)送同步序列編號(hào)(SynchronizeSequenceNumbers,SYN)包(SYN=j)到目的端,等待目的端確認(rèn)。

第二次握手:目的端收到SYN包,確認(rèn)源端的SYN(ACK=j+1),同時(shí)自己也發(fā)送一個(gè)SYN包(SYN=k),即SYN+ACK包。

第三次握手:源端收到目的端的SYN+ACK包,向目的端發(fā)送確認(rèn)包ACK(ACK=k+1)。此包發(fā)送完畢,源端和目的端完成三次握手,源端可以向目的端發(fā)送數(shù)據(jù)。9.1.4TCP/IP協(xié)議簡(jiǎn)介

在使用TCP協(xié)議傳輸數(shù)據(jù)之前,雙方會(huì)通過(guò)握手的方式來(lái)進(jìn)行初始化,握手的目的是使數(shù)據(jù)段的發(fā)送和接收同步,建立虛連接。在建立虛連接以后,TCP每次發(fā)送的數(shù)據(jù)段都有順序號(hào),這樣目的端就可以知道是否所有的數(shù)據(jù)段都已經(jīng)收到,同時(shí)在接收到數(shù)據(jù)段以后,必須在一個(gè)指定的時(shí)間內(nèi)發(fā)送一個(gè)確認(rèn)信息。如果發(fā)送方?jīng)]有接收到這個(gè)確認(rèn)信息,它將重新發(fā)送數(shù)據(jù)段。如果收到的數(shù)據(jù)段有損壞,接收方直接丟棄,因?yàn)闆](méi)有發(fā)送確認(rèn)信息,所以發(fā)送方也會(huì)重新發(fā)送數(shù)據(jù)段。

在使用TCP協(xié)議通信的過(guò)程中,還需要一個(gè)協(xié)議的端口號(hào)來(lái)標(biāo)明自己在主機(jī)(含網(wǎng)絡(luò)設(shè)備)中的唯一性,這樣才可以在一臺(tái)主機(jī)上建立多個(gè)TCP連接,告知具體哪個(gè)應(yīng)用層協(xié)議來(lái)使用。端口號(hào)只能是從0?65535當(dāng)中的任意整數(shù),其中常見(jiàn)的端口號(hào)及對(duì)應(yīng)的應(yīng)用層協(xié)議如表9.1所示。9.1.4TCP/IP協(xié)議簡(jiǎn)介

表9.1端口號(hào)及對(duì)應(yīng)的應(yīng)用層協(xié)議端口號(hào)協(xié)議21FTP(文件傳輸協(xié)議)23Telnet(遠(yuǎn)程登錄協(xié)議)25SMTP(簡(jiǎn)單郵件傳輸協(xié)議)53DNS(域名服務(wù))80HTTP(超文本傳輸協(xié)議)110POP3(郵局協(xié)議3)9.1.4TCP/IP協(xié)議簡(jiǎn)介 UDP(UserDatagramprotocol)用戶數(shù)據(jù)報(bào)協(xié)議,是另外一個(gè)重要的協(xié)議,它提供的是無(wú)連接、面向事務(wù)的簡(jiǎn)單不可靠信息傳送服務(wù)。UDP不提供分割、重組數(shù)據(jù)和對(duì)數(shù)據(jù)進(jìn)行排序的功能,也就是說(shuō),當(dāng)數(shù)據(jù)發(fā)送之后,是無(wú)法得知其是否安全完整的到達(dá)。

在選擇使用傳輸層協(xié)議時(shí),選擇UDP必須要謹(jǐn)慎。因?yàn)樵诰W(wǎng)絡(luò)環(huán)境不好的情況下,UDP協(xié)議數(shù)據(jù)丟失會(huì)比較嚴(yán)重。但同時(shí)也因?yàn)閁DP的特性,它是無(wú)連接的協(xié)議,因而具有資源消耗小,處理速度快的優(yōu)點(diǎn),所以在音頻和視頻的傳送時(shí)使用UDP較多,因?yàn)檫@樣的數(shù)據(jù)傳輸即使偶爾丟失一兩個(gè)數(shù)據(jù),也不會(huì)對(duì)接收結(jié)果產(chǎn)生太大影響。9.1.4TCP/IP協(xié)議簡(jiǎn)介

●應(yīng)用層

應(yīng)用層對(duì)應(yīng)于OSI參考模型的會(huì)話層、表示層和應(yīng)用層,該層向用戶提供一組常用的應(yīng)用程序服務(wù),比如電子郵件、文件傳輸訪問(wèn)、遠(yuǎn)程登錄等。應(yīng)用層協(xié)議主要包括: FTP(FileTransferProtocol)文件傳輸協(xié)議,上傳、下載文件可以使用FTP服務(wù)。Telnet是提供用戶遠(yuǎn)程登錄的服務(wù),使用明碼傳送,保密性差、但簡(jiǎn)單方便。DNS(DomainNameService)域名解析服務(wù),提供域名和IP地址之間的解析轉(zhuǎn)換。SMTP(SimpleMailTransferProtocol)簡(jiǎn)單郵件傳輸協(xié)議,用來(lái)控制郵件的發(fā)送、中轉(zhuǎn)。9.1.4TCP/IP協(xié)議簡(jiǎn)介 HTTP(HypertextTransferProtocol)超文本傳輸協(xié)議,用于實(shí)現(xiàn)互聯(lián)網(wǎng)中的WWW服務(wù)。 POP3(PostOfficeProtocol3)即郵局協(xié)議的第三個(gè)版本,它是規(guī)定個(gè)人計(jì)算機(jī)如何連接到互聯(lián)網(wǎng)上的郵件服務(wù)器進(jìn)行收發(fā)郵件的協(xié)議。9.1.5數(shù)據(jù)封裝和解封

在TCP/IP層次模型中,每一層負(fù)責(zé)接收上一層的數(shù)據(jù),根據(jù)本層的需要進(jìn)行數(shù)據(jù)處理,并增加本層的頭部信息后轉(zhuǎn)發(fā)到下層。當(dāng)接收方收到數(shù)據(jù)以后,對(duì)應(yīng)的層負(fù)責(zé)查看本層的頭部信息是否正確,是否需要合并或進(jìn)行其他處理,然后完成相應(yīng)的操作,去掉本層添加的頭部信息后提交給上一層。TCP/IP協(xié)議數(shù)據(jù)封裝和解封的過(guò)程如圖9.2所示。9.1.5數(shù)據(jù)封裝和解封圖9.2TCP/IP協(xié)議數(shù)據(jù)封裝和解封感謝觀看,下次再見(jiàn)IP地址和域名單元九IP地址IP地址類型子網(wǎng)掩碼目錄CONTENTS1234域名9.2.1IP地址

在現(xiàn)實(shí)生活中,每一個(gè)地理位置都有一個(gè)詳細(xì)的通信地址,根據(jù)這個(gè)通信地址,信件、快遞物品可以送到指定的位置。在網(wǎng)絡(luò)上,每一臺(tái)要通信的主機(jī)(含網(wǎng)絡(luò)設(shè)備)也必須有一個(gè)IP地址,它的作用就是其他主機(jī)可以通過(guò)這個(gè)IP地址找到它。

每個(gè)IP地址都由兩部分組成:網(wǎng)絡(luò)號(hào)和主機(jī)號(hào)。網(wǎng)絡(luò)號(hào)用來(lái)標(biāo)識(shí)這個(gè)IP地址屬于哪一個(gè)網(wǎng)絡(luò),就像一個(gè)通信地址中都有一個(gè)城市名一樣。在一個(gè)網(wǎng)絡(luò)當(dāng)中的所有主機(jī),應(yīng)該有相同的網(wǎng)絡(luò)號(hào)。主機(jī)號(hào)用來(lái)標(biāo)識(shí)這個(gè)網(wǎng)絡(luò)中的唯一一臺(tái)主機(jī),相當(dāng)于通信地址中的街道門牌號(hào)。 IP地址有兩種表示方式,二進(jìn)制表示和點(diǎn)分十進(jìn)制表示,我們常見(jiàn)的是點(diǎn)分十進(jìn)制表示的IP地址。IP地址的長(zhǎng)度為32位,每8位組成一個(gè)部分,這樣一個(gè)IP地址可以分為4個(gè)部分,每個(gè)部分如果用十進(jìn)制表示,其值在0?255之間。例如用點(diǎn)分十進(jìn)制表示的IP地址2,其二進(jìn)制表示為01110111101110101101001101011100??梢钥闯?,在使用十進(jìn)制表示的時(shí)候,中間用點(diǎn)號(hào)隔開(kāi)。9.2.2IP地址類型

在IP協(xié)議提出時(shí),為了劃分大小不同的網(wǎng)絡(luò),使某種類型的網(wǎng)絡(luò)中主機(jī)的數(shù)量在一定范圍之內(nèi),定義了5種IP地址類型。

●A類地址

具有A類地址的網(wǎng)絡(luò)可以擁有很大數(shù)量的主機(jī)。A類地址的最高位固定總為0,加上之后緊跟著7位,共8位一起表示網(wǎng)絡(luò)號(hào),剩下的24位表示主機(jī)號(hào)。這樣根據(jù)IP協(xié)議的約定,整個(gè)網(wǎng)絡(luò)擁有27-2共計(jì)126個(gè)A類網(wǎng)絡(luò),而每個(gè)A類網(wǎng)絡(luò)中可以擁有最多224-2大約1700萬(wàn)臺(tái)主機(jī)。

在一個(gè)網(wǎng)絡(luò)中,不是所有的主機(jī)號(hào)都可以分配給主機(jī)使用,其中有兩個(gè)主機(jī)號(hào)是有特殊含義的,一個(gè)是全0的主機(jī)號(hào),表示網(wǎng)絡(luò)本身;一個(gè)是全1的主機(jī)號(hào),表示廣播地址,所以才會(huì)出現(xiàn)一個(gè)網(wǎng)絡(luò)中可以擁有的主機(jī)數(shù)是理論計(jì)算值減2的情況。9.2.2IP地址類型

●B類地址 B類地址一般用來(lái)分配到中等或稍大規(guī)模的網(wǎng)絡(luò)中。B類地址的最高兩位固定是10,與后面的14位一起構(gòu)成網(wǎng)絡(luò)號(hào),剩下的16位表示主機(jī)號(hào)。這樣根據(jù)IP協(xié)議的約定,整個(gè)網(wǎng)絡(luò)擁有214共計(jì)16384個(gè)B類網(wǎng)絡(luò),而每個(gè)B類網(wǎng)絡(luò)中可以擁有最多216-2大約65000臺(tái)主機(jī)。

●C類地址 C類地址分配給主機(jī)數(shù)量不多的網(wǎng)絡(luò)。C類地址的最高三位固定是110,和后面跟著21位一起構(gòu)成網(wǎng)絡(luò)號(hào),只有8位表示主機(jī)號(hào)。整個(gè)網(wǎng)絡(luò)擁有221共計(jì)200多萬(wàn)個(gè)B類網(wǎng)絡(luò),但是每個(gè)B類網(wǎng)絡(luò)最多只有28-2共計(jì)254臺(tái)主機(jī)。9.2.2IP地址類型

●D類地址 D類地址不分網(wǎng)絡(luò)地址和主機(jī)地址,前四位必須是1110,它是一個(gè)專門保留的地址。它并不指向特定的網(wǎng)絡(luò),目前這一類地址被用在多點(diǎn)廣播(Multicast)中。

●E類地址 E類地址也不分網(wǎng)絡(luò)地址和主機(jī)地址,前五位必須是11110,為將來(lái)使用保留。

另外需要特別指出的是,A、B、C三類地址中還各有一個(gè)網(wǎng)段被應(yīng)用到內(nèi)部局域網(wǎng)中,而不能在實(shí)際的互聯(lián)網(wǎng)上出現(xiàn),即10網(wǎng)段、172.16.X.X到172.31.x.x網(wǎng)段和192.168網(wǎng)段。使用這3個(gè)網(wǎng)段中IP地址的主機(jī),不能直接出現(xiàn)在互聯(lián)網(wǎng)上,需要通過(guò)一些其他的手段才能上網(wǎng)。9.2.3子網(wǎng)掩碼

根據(jù)IP地址類型的劃分,出現(xiàn)了網(wǎng)絡(luò)中提供的IP地址的數(shù)量與實(shí)際需求相差甚遠(yuǎn)的情況。雖然看起來(lái)IP地址的絕對(duì)數(shù)量應(yīng)該能滿足人們的需求,但是由于IP地址由網(wǎng)絡(luò)號(hào)和主機(jī)號(hào)構(gòu)成,所以網(wǎng)絡(luò)中A類網(wǎng)絡(luò)才126個(gè),最多的C類網(wǎng)址也不過(guò)200多萬(wàn)個(gè)。隨著互聯(lián)網(wǎng)的普及,IP網(wǎng)絡(luò)越來(lái)越不夠分,因此,人們提出了很多解決方案,其中目前使用范圍最廣的就是使用子網(wǎng)的方式對(duì)原網(wǎng)絡(luò)進(jìn)行再次劃分。

我們知道IP地址分為網(wǎng)絡(luò)號(hào)和主機(jī)號(hào),子網(wǎng)就是把主機(jī)號(hào)再分為子網(wǎng)號(hào)和主機(jī)號(hào),這樣,原來(lái)的一個(gè)A類網(wǎng)絡(luò)就不再總是擁有1700多萬(wàn)臺(tái)主機(jī)了。原來(lái)的網(wǎng)絡(luò)可以進(jìn)一步劃分,即使是C類網(wǎng)絡(luò)也可以進(jìn)一步劃分為更小的子網(wǎng),實(shí)現(xiàn)這一技術(shù)的就是子網(wǎng)掩碼。9.2.3子網(wǎng)掩碼

子網(wǎng)掩碼是一種用來(lái)指明一個(gè)IP地址的哪些位標(biāo)識(shí)的是網(wǎng)絡(luò)號(hào)(含子網(wǎng)號(hào))以及哪些位標(biāo)識(shí)的是主機(jī)號(hào)的位掩碼。子網(wǎng)掩碼不能單獨(dú)存在,它必須結(jié)合IP地址一起使用。子網(wǎng)掩碼只有一個(gè)作用,就是將某個(gè)IP地址劃分成網(wǎng)絡(luò)地址和主機(jī)地址兩部分。 A類地址的默認(rèn)子網(wǎng)掩碼為11111111000000000000000000000000,點(diǎn)分十進(jìn)制表示為,這就表示A類地址的前8位是網(wǎng)絡(luò)號(hào),后24位是主機(jī)號(hào)。例如前面用點(diǎn)分十進(jìn)制表示的IP地址2,其二進(jìn)制表示為01110111101110101101001101011100。從點(diǎn)分十進(jìn)制IP地址的第一部分可以看出,這個(gè)P地址為A類地址,其默認(rèn)子網(wǎng)掩碼即為。9.2.3子網(wǎng)掩碼

9.2.3子網(wǎng)掩碼

另外,子網(wǎng)掩碼必須是由連續(xù)的1和連續(xù)的0組成,換算成十進(jìn)制可以看出,最后一個(gè)數(shù)只能是0、128、192、224、240、248、252、254、255這幾個(gè)數(shù)字。

除了用劃分子網(wǎng)的方式解決IP網(wǎng)絡(luò)和IP地址資源緊缺的問(wèn)題外,目前還有一種解決方式就是采用新的IP版本(即IPv6),它對(duì)現(xiàn)有IP地址進(jìn)行了大規(guī)模的改革,其中IP地址使用128位來(lái)表示。從目前看來(lái),這些IP地址足夠給每個(gè)人的每個(gè)設(shè)備提供一個(gè)獨(dú)一無(wú)二的IP地址,目前已經(jīng)有一些軟硬件開(kāi)始支持IPv6。9.2.4域名

域名(DomainName),是由一串用點(diǎn)號(hào)分隔的名字組成的Internet上某一臺(tái)計(jì)算機(jī)或計(jì)算機(jī)組的名稱,用于在數(shù)據(jù)傳輸時(shí)標(biāo)識(shí)計(jì)算機(jī)的電子方位。

在網(wǎng)絡(luò)中,要想找到一臺(tái)主機(jī),是通過(guò)IP地址尋找的。但I(xiàn)P地址是數(shù)字標(biāo)識(shí),使用時(shí)難以記憶和書(shū)寫,因此在IP地址的基礎(chǔ)上又發(fā)展出一種符號(hào)化的地址方案,來(lái)代替數(shù)字型的IP地址。每一個(gè)符號(hào)化的地址都與特定的IP地址對(duì)應(yīng),這樣網(wǎng)絡(luò)上的資源訪問(wèn)起來(lái)就容易得多了。這個(gè)與網(wǎng)絡(luò)上的數(shù)字型IP地址相對(duì)應(yīng)的字符型地址就是域名。

我們?cè)谠L問(wèn)搜狐的時(shí)候,在瀏覽器地址欄輸入的就是域名。通常來(lái)說(shuō),在域名中,主機(jī)名放在前面,域名放在后面,搜狐的域名中www是主機(jī)名,是域名。域名可分為不同級(jí)別,包括頂級(jí)域名、二級(jí)域名等。頂級(jí)域名又可分為兩類:9.2.4域名

一類是國(guó)家頂級(jí)域名,200多個(gè)國(guó)家都按照IS03166國(guó)家代碼分配了頂級(jí)域名,例如中國(guó)是cn,美國(guó)是us,韓國(guó)是kr等。

另外一類是國(guó)際頂級(jí)域名,例如表示工商企業(yè)的com,表示網(wǎng)絡(luò)提供商的net,表示非盈利組織的org等。

二級(jí)域名是指頂級(jí)域名之下的域名,例如在國(guó)際頂級(jí)域名下,由域名注冊(cè)人申請(qǐng)注冊(cè)的網(wǎng)上名稱,例如sohu、apple、microsoft等。在國(guó)家頂級(jí)域名下,一般二級(jí)域名表不注冊(cè)企業(yè)類別的符號(hào),例如com、edu、gov、net等。感謝觀看,下次再見(jiàn)Java與網(wǎng)絡(luò)單元九IP地址類URL類URLConnection類目錄CONTENTS1239.3.1IP地址類

在TCP/IP協(xié)議族中,我們是通過(guò)IP地址來(lái)標(biāo)識(shí)網(wǎng)絡(luò)上的一臺(tái)主機(jī)(含網(wǎng)絡(luò)設(shè)備)的。如果想獲取自己主機(jī)的IP地址,可以通過(guò)打開(kāi)“Internet協(xié)議版本4(TCP/IPv4)屬性”對(duì)話框方式查看(必須是設(shè)置固定IP地址,而不是自動(dòng)獲取IP地址),還可以通過(guò)ipconfig命令查看。假設(shè)需要在程序中獲取本機(jī)的IP地址,該如何編寫代碼呢?9.3.1IP地址類

通過(guò)查閱JDKAPI文檔獲悉,在Java中,使用包下的InetAddress類表示互聯(lián)網(wǎng)協(xié)議的IP地址。下面的案例演示了如果獲得本地主機(jī)的IP地址,具體代碼如下:import.*;publicclassTestGetIP{publicstaticvoidmain(Stringargs[]){InetAddressmylP=null;try{//通過(guò)InetAddress類的靜態(tài)方法,返回本地主機(jī)對(duì)象myIP=InetAddress.getLocalHost();}catch(Exceptione){e.printStackTrace();}//通過(guò)InetAddress類的getHostAddress()方法獲得IP地址字符串System.out.println(myIP.getHostAddress());}}9.3.1IP地址類

編譯、運(yùn)行程序,顯示出本地主機(jī)的IP地址。如果我們不僅想獲得本地主機(jī)的IP地址,還想根據(jù)用戶輸入的域名,獲取這個(gè)域名在互聯(lián)網(wǎng)上的IP地址,下面的代碼演示了此功能:importjava.util.Scanner;import*;publicclassTestGetIP2{publicstaticvoidmain(Stringargs[]){InetAddresssohuIP=null;Scannerinput=newScanner(System.in);System.out.print("請(qǐng)輸入要查詢IP地址的域名:");StringdName=input.next();try{//通過(guò)InetAddress類的靜態(tài)方法,返回指定域名的IP地址對(duì)象sohuIP=InetAddress.getByName(dName);}catch(Exceptione){e.printStackTrace();}System.out.println("域名:"+dName+"對(duì)應(yīng)的IP地址為:"+sohuIP.getHostAddress());}}9.3.1IP地址類

編譯、運(yùn)行程序,其結(jié)果如圖9.4所示。圖9.4獲取指定域名的IP地址9.3.1IP地址類

上面的兩個(gè)例子中,創(chuàng)建的InetAddress類對(duì)象都不是使用構(gòu)造方法new出這個(gè)對(duì)象,而是通過(guò)InetAddress類的靜態(tài)方法獲取的。下面列出了通過(guò)InetAddress類的靜態(tài)方法獲取InetAddress類對(duì)象的方法:

●InetAddress[]getAllByName(Stringhost)

在給定主機(jī)名的情況下,根據(jù)系統(tǒng)上配置的名稱服務(wù)返回其IP地址所組成的數(shù)組。

●InetAddressgetByAddress(byte[]addr)

在給定原始IP地址的情況下,返回InetAddress對(duì)象。

●InetAddressgetByAddress(Stringhost,byte[]addr)

根據(jù)提供的主機(jī)名和IP地址,創(chuàng)建InetAddress對(duì)象。

●InetAddressgetByName(Stringhost)

在給定主機(jī)名的情況下,返回InetAddress對(duì)象。

●InetAddressgetLocalHost()

返回本地主機(jī)InetAddress對(duì)象。9.3.1IP地址類

InetAddress類的其他常用方法有:

●byte[]getAddress()

返回此InetAddress對(duì)象的原始IP地址。

●StringgetCanonicalHostName()

返回此IP地址的完全限定域名。完全限定域名是指主機(jī)名加上全路徑,全路徑中列出了序

列中所有域成員。

●StringgetHostAddress()

返回IP地址字符串。

●StringgetHostName()

返回此IP地址的主機(jī)名。9.3.2URL類

Java提供的網(wǎng)絡(luò)功能的相關(guān)類主要有三個(gè),它們分別是URL、Socket和Datagram,其中URL是這三個(gè)類中層次級(jí)別最高或者說(shuō)封裝最多的類,通過(guò)URL類可以直接發(fā)送或讀取網(wǎng)絡(luò)上的數(shù)據(jù)。 URL類代表一個(gè)統(tǒng)一資源定位符,它是指向互聯(lián)網(wǎng)資源的指針。資源可以是簡(jiǎn)單的文件或目錄,也可以是對(duì)更為復(fù)雜的對(duì)象的引用,例如對(duì)數(shù)據(jù)庫(kù)或搜索引擎的查詢。

通常,URL可分成幾個(gè)部分。例如/view/29.htm,指示使用的協(xié)議為HTTP(超文本傳輸協(xié)議),并且該信息駐留在一臺(tái)名為的主機(jī)上,主機(jī)上的信息名稱為/view/29.htm。 URL可選擇指定一個(gè)端口號(hào),用于建立到遠(yuǎn)程主機(jī)TCP連接的端口號(hào),例如:8080/examples/index.html。如果未指定該端口號(hào),則使用協(xié)議默認(rèn)的端口,HTTP協(xié)議的默認(rèn)端口為80。9.3.2URL類

URL后面可能還跟有一個(gè)片段,也稱為引用。該片段由井字符“#”指示,后面跟有更多的字符。例如/index.html#chapterl。使用此片段的目的在于表明,在獲取到指定的資源后,應(yīng)用程序需要使用文檔中附加有chapter1標(biāo)記的部分。ApacheTomcatExamples圖9.5網(wǎng)絡(luò)上指定資源頁(yè)面9.3.2URL類

下面通過(guò)一個(gè)案例,演示如何獲取網(wǎng)絡(luò)上指定資源(:8080/examples/index.html)的信息。這個(gè)頁(yè)面的具體內(nèi)容如圖7.5所示,其HTML代碼如下所示:<!D0CTYPEHTMLPUBLIC"-//W3C//DTDHTML4.0Transitional//EN"><HTML><HEAD><TITLE>ApacheTomcatExamples</TITLE><METAhttp-equiv=Content-Typecontent="text/html"></HEAD><B0DY><P><H3>ApacheTomcatExamples</H3><P></P><ul><li><ahref="servlets">Servletsexamples</a></li><li><ahref="jsp">JSPExamples</a></li></ul></B0DY></HTML>9.3.2URL類這個(gè)案例的具體需求為先輸入要定位的URL地址,然后再輸入要顯示哪個(gè)頁(yè)面標(biāo)簽元素的內(nèi)容,程序顯示該標(biāo)簽的具體內(nèi)容,具體代碼如下://通過(guò)URL字符串創(chuàng)建URL對(duì)象tURL=newURL(url);in=newBufferedReader(newInputStreamReader(tURL.openStream()));Strings;while((s=in.readLine())!=null){if(s.contains(iStr))System.out.println(s);}}catch(Exceptione){e.printStackTrace();}}}importjava.util.Scanner;import.*;importjava.io.*;publicclassTestURL{publicstaticvoidmain(Stringargs[]){URLtURL=null;BufferedReaderin=null;Scannerinput=newScanner(System.in);System.out.print("請(qǐng)輸入要定位的URL地址:");Stringurl=input.next();System.out.print("請(qǐng)輸入要顯示哪個(gè)頁(yè)面標(biāo)簽元素的內(nèi)容:");StringiStr=input.next();try{9.3.2URL類

編譯、運(yùn)行程序,先后輸入:8080/examples/index.html和TITLE,其運(yùn)行結(jié)果如圖9.6所示。圖9.6URL類使用9.3.3URLConnection類

前面介紹的URL類代表的是一個(gè)網(wǎng)絡(luò)資源的位置,而接下來(lái)要介紹的URLConnection代表的是一種連接。此類的實(shí)例可用于讀取和寫入對(duì)應(yīng)URL引用的資源。通常,創(chuàng)建一個(gè)到URL的連接URLConnection的對(duì)象需要以下幾個(gè)步驟:(1)通過(guò)在URL上調(diào)用openConnection()方法創(chuàng)建連接對(duì)象。(2)設(shè)置參數(shù)和一般請(qǐng)求屬性。(3)使用connect()方法建立到遠(yuǎn)程對(duì)象的實(shí)際連接。(4)遠(yuǎn)程對(duì)象變?yōu)榭捎茫渲羞h(yuǎn)程對(duì)象的頭字段和內(nèi)容變?yōu)榭稍L問(wèn)。9.3.3URLConnection類

URLConnection類有下列屬性作為參數(shù)可以設(shè)置: booleandolnput:將doInput標(biāo)志設(shè)置為true,指示應(yīng)用程序要從URL連接讀取數(shù)據(jù),此屬性的默認(rèn)值為true。此屬性由setDoInput()方法設(shè)置,其值由getDoInput()方法返回。 booleandoOutput:將doOutput標(biāo)志設(shè)置為true,指示應(yīng)用程序要將數(shù)據(jù)寫入U(xiǎn)RL連接,此屬性的默認(rèn)值為false。此屬性由setDoOutput()方法設(shè)置,其值由getDoOutput()方法返回。 longifModifiedSince:有些網(wǎng)絡(luò)協(xié)議支持跳過(guò)對(duì)象獲取,除非該對(duì)象在某個(gè)特定時(shí)間點(diǎn)之后又進(jìn)行了修改。其值表示距離格林威治標(biāo)準(zhǔn)時(shí)間1970年1月1日的毫秒數(shù),只有在該時(shí)間之后又進(jìn)行了修改時(shí),才獲取該對(duì)象。此屬性的默認(rèn)值為0,表示必須一直進(jìn)行獲取。此屬性由setlfModifiedSince()方法設(shè)置,其值由getIfModifiedSince()方法返回。9.3.3URLConnection類

booleanuseCaches:如果其值為true,則只要有條件就允許協(xié)議使用緩存;如果其值為false,則該協(xié)議始終必須獲得此對(duì)象的新副本,其默認(rèn)值為上一次調(diào)用setDefaultUseCaches()方法時(shí)給定的值。此屬性由setUseCaches()方法設(shè)置,其值由getUseCaches()方法返回。 booleanallowUserlnteraction:如果其值為true,則在允許用戶交互(例如彈出一個(gè)驗(yàn)證對(duì)話框)的上下文中對(duì)此URL進(jìn)行檢查;如果其值為false,則不允許有任何用戶交互,其默認(rèn)值為上一次調(diào)用setDefaultAllowUserlnteraction()方法所用的參數(shù)的值。使用setAllowUserlnteraction()方法可對(duì)此屬性的值進(jìn)行設(shè)置,其值由getAllowUserlnteraction()方法返回。 URLConnection類還有兩個(gè)屬性connected和url,分別表不是否創(chuàng)建到指定URL的通信鏈接和該URLConnection類在互聯(lián)網(wǎng)上打開(kāi)的遠(yuǎn)程對(duì)象。

另外,可以使用setRequestProperty(Stringkey,Stringvalue)方法設(shè)置一般請(qǐng)求屬性,如果已存在具有該關(guān)鍵字的屬性,則用新值改寫原值。9.3.2URL類

下面通過(guò)一個(gè)案例,簡(jiǎn)要說(shuō)明URLConnection類的使用。URLConnection類里涉及的一些知識(shí)我們現(xiàn)在還沒(méi)有學(xué)習(xí)到,在閱讀下面的代碼時(shí)如果有不明白的地方,通過(guò)后面的課程學(xué)習(xí)會(huì)逐步理解。hUrlC.setDoInput(true);//請(qǐng)求如果是POST,不能使用緩存hUrlC.setUseCaches(false);//設(shè)置Content-Type屬性hUrlC.setRequestProperty("ContentType","text/plain;charset=utf-8");//設(shè)定請(qǐng)求的方法為POST,默認(rèn)是GEThUrlC.setRequestMethod("POST");//(3)使用connect方法建立到遠(yuǎn)程對(duì)象的實(shí)際連接hUrlC.connect();//(4)遠(yuǎn)程對(duì)象變?yōu)榭捎?/通過(guò)HttpURLConnecticm獲取輸出輸入流,可根據(jù)需求進(jìn)一步操作OutputStreamoutStrm=hUrlC.getOutputStream();InputStreaminStrm=hUrIC.getlnputStream();//省略若干代碼}catch(Exceptione){e.printStackTrace();}}import.*;importjava.io.*;publicclassTestURLConnection{publicstaticvoidmain(Stringargs[]){try{//(1)通過(guò)在URL上調(diào)用openConnection()方法創(chuàng)建連接對(duì)象URLurl=newURL(":8080/examples/mdex.html");//根據(jù)URL獲取URLConnection對(duì)象URLConnectionurlC=url.openConnection();//請(qǐng)求協(xié)議是HTTP協(xié)議,故可轉(zhuǎn)換為HttpURLConnection對(duì)象HttpURLConnectionhUrlC=(HttpURLCormection)urlC;//(2)設(shè)置參數(shù)和一般請(qǐng)求屬性//請(qǐng)求方法如果是POST,參數(shù)要放在請(qǐng)求體里,所以要向hUrlC輸出參數(shù)hUrlC.setDoOutput(true);//設(shè)置是否從httpUrlConnection讀入,默認(rèn)情況下是true感謝觀看,下次再見(jiàn)Socket編程單元九基于TCP的Socket編程目錄CONTENTS1基于UDP的Socket編程29.4.1基于TCP的Socket編程

根據(jù)ServerSocket用于服務(wù)器端,而Socket是建立網(wǎng)絡(luò)連接時(shí)使用的。在連接成功時(shí),應(yīng)用程序兩端都會(huì)產(chǎn)生一個(gè)Socket實(shí)例,操作這個(gè)實(shí)例,完成所需的會(huì)話。對(duì)于一個(gè)網(wǎng)絡(luò)連接來(lái)說(shuō),套接字是平等的,不因?yàn)樵诜?wù)器端或在客戶端而產(chǎn)生不同級(jí)別。不管是Socket還是ServerSocket,它們的工作都是通過(guò)Socketlmp1類及其子類完成的。關(guān)于Socket、ServerSocket及Socketlmp1類的具體方法,這里不再一一介紹,需要這些類時(shí),請(qǐng)大家自行查閱JDKAPI文檔。9.4.1基于TCP的Socket編程

圖9.7展示了基于TCP的Socket編程的示意圖。圖9.7基于TCP的Socket編程

在服務(wù)器端,創(chuàng)建一個(gè)ServerSocket對(duì)象,并指定一個(gè)端口號(hào),使用ServerSocket類的accept()服務(wù)器處于阻塞狀態(tài),等待用戶請(qǐng)求。

在客戶端,通過(guò)指定一個(gè)InetAddress對(duì)象和一個(gè)端口號(hào),創(chuàng)建一個(gè)Socket對(duì)象,通過(guò)這個(gè)Socket對(duì)象,連接到服務(wù)器。9.4.1基于TCP的Socket編程

首先我們來(lái)看服務(wù)器端程序,具體代碼如下:import.*;importjava.io.*;publicclassTestServer{publicsaticvoidmain(Stringargs[]){try{//創(chuàng)建一個(gè)ServerSocket對(duì)象,并端口號(hào)8888ServerSockets=newServerSocket(8888);while(true){//偵聽(tīng)并接受到此套接字的連接Sockets1=s.accept();OutputStreamos=s1.getOutputStream();DataOutputStreamdos=newDataOutputStream(os);dos.writeUTF("客戶端IP:"+s1.getInetAddress().getHostAddress()+"客戶端端口號(hào):"+s1.getPort());dos.close();sl.close();}}catch(IOExceptione){e.printStackTrace();System.out.println("程序運(yùn)行出錯(cuò)!");}}}9.4.1基于TCP的Socket編程

該服務(wù)器端程序的作用就是監(jiān)聽(tīng)8888端口,當(dāng)有發(fā)送到本機(jī)8888端口的Socket請(qǐng)求時(shí),建立輸出流,將通過(guò)accept()方法創(chuàng)建的Socket對(duì)象的IP地址和端口號(hào)輸出到客戶端。編譯、運(yùn)行程序,使服務(wù)器啟動(dòng)并處于監(jiān)聽(tīng)狀態(tài)。下面編寫客戶端程序9.4.1基于TCP的Socket編程

import.*;importjava.io.*;publicclassTestClient{publicstaticvoidmain(Stringargs[]){try{//通過(guò)IP地址和端口號(hào),創(chuàng)建一個(gè)Socket對(duì)象Sockets1=newSocket("127.0,0.1",8888);//建立輸入數(shù)據(jù)流InputStreamis=s1.getInputStream();DataInputStreamdis=newDataInputStream(is);System.out.println(dis.readUTF());dis.close();s1.close();}catch(ConnectExceptione){e.printStackTrace();System.err.println("服務(wù)器連接失??!");}catch(IOExceptione){e.printStackTrace();}}}9.4.1基于TCP的Socket編程

該客戶端程序通過(guò)IP地址和端口號(hào)8888,創(chuàng)建一個(gè)客戶端Socket對(duì)象,建立輸入數(shù)據(jù)流,通過(guò)輸入數(shù)據(jù)流讀取指定1P地址和端口號(hào)上服務(wù)器端程序的輸出,并在控制臺(tái)將服務(wù)器的輸出顯示出來(lái)。編譯、運(yùn)行程序,結(jié)果如圖9.8所示。圖9.8使用JavaSocket編程9.4.1基于TCP的Socket編程

在這個(gè)通過(guò)JavaSocket編程實(shí)現(xiàn)的客戶端、服務(wù)器端程序中,客戶端沒(méi)有請(qǐng)求的具體內(nèi)容,只要有請(qǐng)求,服務(wù)器就將指定的內(nèi)容發(fā)送給客戶端,客戶端將接收的內(nèi)容顯示出來(lái)。接下來(lái)對(duì)上面的案例進(jìn)行調(diào)整,服務(wù)器端可以接收客戶端請(qǐng)求的內(nèi)容,并顯示在服務(wù)器端控制臺(tái)上。具體服務(wù)器端程序代碼如下:importjava.io.*;import.*;publicclassTestSockServer{publicstaticvoidmain(String[]args){InputStreamin=null;OutputStreamout==null;try{ServerSockets=newServerSocket(8888);Sockets1=s.accept();in=s1.getInputStream();out=s1.getOutputStream();DataOutputStreamdos=newDataOutputStream(out);DataInputStreamdis=newDataInputStream(in);Stringstr=null;if((str=dis.readUTF())!=null){System.out.println("客戶端輸入內(nèi)容:"+str);System.out.println("客戶端IP:"+s1.getInetA,ddress().getHostAddress());System.out.println("客戶端端口號(hào):"u+s1.getPort());}dos.writeUTF("服務(wù)器端反饋客戶端!");dis.close();dos.close();s1.olose();}catch(IOExceptione){e.printStackTrace();}}}9.4.1基于TCP的Socket編程

客戶端代碼如下:import.*;importjava.io.*;publicclassTestSockClient{publicstaticvoidmain(String[]args){InputStreamis=null;OutputStreamos=null;Strings=null;try{Socketsocket=newSocket("localhost",8888);is=socket.getInputStream();os=socket.getOutputStream();DataInputStreamdis=newDataInputStream(is);DataOutputStxeamdos=newDataOutputStream(os);//客戶端向服務(wù)器端發(fā)送請(qǐng)求的內(nèi)容dos.writeUTF("客戶端提交服務(wù)器");if((s=dis.readUTF())!=null)System.out.println(s);dos.close();dis.close();socket.close();}catch(UnknownHostExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTra

溫馨提示

  • 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)論