網(wǎng)絡(luò)編程學(xué)習(xí)_第1頁(yè)
網(wǎng)絡(luò)編程學(xué)習(xí)_第2頁(yè)
網(wǎng)絡(luò)編程學(xué)習(xí)_第3頁(yè)
網(wǎng)絡(luò)編程學(xué)習(xí)_第4頁(yè)
網(wǎng)絡(luò)編程學(xué)習(xí)_第5頁(yè)
已閱讀5頁(yè),還剩25頁(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、JAVA網(wǎng)絡(luò)編程網(wǎng)絡(luò)編程對(duì)于很多的初學(xué)者來(lái)說(shuō),都是很向往的一種編程技能,但是很多的初學(xué)者卻因?yàn)楹荛L(zhǎng)一段時(shí)間無(wú)法進(jìn)入網(wǎng)絡(luò)編程的大門而放棄了對(duì)于該部分技術(shù)的學(xué)習(xí)。在 學(xué)習(xí)網(wǎng)絡(luò)編程以前,很多初學(xué)者可能覺得網(wǎng)絡(luò)編程是比較復(fù)雜的系統(tǒng)工程,需要了解很多和網(wǎng)絡(luò)相關(guān)的基礎(chǔ)知識(shí),其實(shí)這些都不是很必需的。首先來(lái)問一個(gè)問題:你會(huì)打手機(jī)嗎很多人可能說(shuō)肯定會(huì)啊,不就是按按電話號(hào)碼,撥打電話嘛,很簡(jiǎn)單的事情啊!其實(shí)初學(xué)者如果入門網(wǎng)絡(luò)編程的話也可以做到這么簡(jiǎn)單!網(wǎng)絡(luò)編程就是在兩個(gè)或兩個(gè)以上的設(shè)備( 例如計(jì)算機(jī)) 之間傳輸數(shù)據(jù)。程序員所作的事情就是把數(shù)據(jù)發(fā)送到指定的位置,或者接收到指定的數(shù)據(jù),這個(gè)就是狹義的網(wǎng)絡(luò)編程范疇。在發(fā)

2、送和接收數(shù)據(jù)時(shí),大部分的程序設(shè)計(jì)語(yǔ)言都設(shè)計(jì)了專門的API 實(shí)現(xiàn)這些功能,程序員只需要調(diào)用即可。所以,基礎(chǔ)的網(wǎng)絡(luò)編程可以和打電話一樣簡(jiǎn)單。下面就開始Java 語(yǔ)言的網(wǎng)絡(luò)編程技術(shù)學(xué)習(xí)吧。網(wǎng)絡(luò)概述網(wǎng) 絡(luò)編程技術(shù)是當(dāng)前一種主流的編程技術(shù),隨著聯(lián)網(wǎng)趨勢(shì)的逐步增強(qiáng)以及網(wǎng)絡(luò)應(yīng)用程序的大量出現(xiàn),所以在實(shí)際的開發(fā)中網(wǎng)絡(luò)編程技術(shù)獲得了大量的使用。本章中以淺顯的基礎(chǔ)知識(shí)說(shuō)明和實(shí)際的案例使廣大初學(xué)者能夠進(jìn)入網(wǎng)絡(luò)編程技術(shù)的大門,至于以后的實(shí)際修行就要閱讀進(jìn)階的書籍以及進(jìn)行大量的實(shí)際練習(xí)。13.1.1 計(jì)算機(jī)網(wǎng)絡(luò)概述( 或多個(gè) ) 設(shè)備 ( 例如計(jì)算機(jī)) 之間的數(shù)據(jù)傳輸。按照計(jì)算機(jī)網(wǎng)絡(luò)的定義,通過一定的物理設(shè)備將處于不同

3、位置的計(jì)算機(jī)連接起來(lái)組成的網(wǎng)絡(luò),這個(gè)網(wǎng)絡(luò)中包含的設(shè)備有:計(jì)算機(jī)、路由器、交換機(jī)等等。其實(shí)從軟件編程的角度來(lái)說(shuō),對(duì)于物理設(shè)備的理解不需要很深刻,就像你打電話時(shí)不需要很熟悉通信網(wǎng)絡(luò)的底層實(shí)現(xiàn)是一樣的,但是當(dāng)深入到網(wǎng)絡(luò)編程的底層時(shí),這些基礎(chǔ)知識(shí)是必須要補(bǔ)的。路由器和交換機(jī)組成了核心的計(jì)算機(jī)網(wǎng)絡(luò),計(jì)算機(jī)只是這個(gè)網(wǎng)絡(luò)上的節(jié)點(diǎn)以及控制等, 通過光纖、網(wǎng)線等連接將設(shè)備連接起來(lái),從而形成了一張巨大的計(jì)算機(jī)網(wǎng)絡(luò)。網(wǎng)絡(luò)最主要的優(yōu)勢(shì)在于共享:共享設(shè)備和數(shù)據(jù),現(xiàn)在共享設(shè)備最常見的是打印機(jī),一個(gè)公司一般一個(gè)打印機(jī)即可,共享數(shù)據(jù)就是將大量的數(shù)據(jù)存儲(chǔ)在一組機(jī)器中,其它的計(jì)算機(jī)通過網(wǎng)絡(luò)訪問這些數(shù)據(jù),例如網(wǎng)站、銀行服務(wù)器等等。

4、如果需要了解更多的網(wǎng)絡(luò)硬件基礎(chǔ)知識(shí),可以閱讀計(jì)算機(jī)網(wǎng)絡(luò)教材,對(duì)于基礎(chǔ)進(jìn)行強(qiáng)化,這個(gè)在基礎(chǔ)學(xué)習(xí)階段不是必須的,但是如果想在網(wǎng)絡(luò)編程領(lǐng)域有所造詣,則是一個(gè)必須的基本功。對(duì)于網(wǎng)絡(luò)編程來(lái)說(shuō),最主要的是計(jì)算機(jī)和計(jì)算機(jī)之間的通信,這樣首要的問題就是如何找到網(wǎng)絡(luò)上的計(jì)算機(jī)呢這就需要了解IP 地址的概念。為了能夠方便的識(shí)別網(wǎng)絡(luò)上的每個(gè)設(shè)備,網(wǎng)絡(luò)中的每個(gè)設(shè)備都會(huì)有一個(gè)唯一的數(shù)字標(biāo)識(shí),這個(gè)就是IP 地址。在計(jì)算機(jī)網(wǎng)絡(luò)中, 現(xiàn)在命名IP 地址的規(guī)定是IPv4協(xié)議,該協(xié)議規(guī)定每個(gè)IP 地址由 4個(gè) 0-255 之間的數(shù)字組成,例如。每個(gè)接入網(wǎng)絡(luò)的計(jì)算機(jī)都擁有唯一的IP 地址, 這個(gè) IP 地址可能是固定的,例如網(wǎng)絡(luò)上

5、各種各樣的服務(wù)器,也可以是動(dòng)態(tài)的,例如使用 ADSLt號(hào)上網(wǎng)的寬帶用戶,無(wú)論以何種方式獲得或是否是固定的,每個(gè)計(jì)算機(jī)在聯(lián)網(wǎng)以后都擁有一個(gè)唯一的合法IP 地址,就像每個(gè)手機(jī)號(hào)碼一樣。但是由于IP 地址不容易記憶,所以為了方便記憶,有創(chuàng)造了另外一個(gè)概念域名(Domain Name)例如等。一個(gè)IP地址可以對(duì)應(yīng)多個(gè)域名,一個(gè)域名只能對(duì)應(yīng)一個(gè) IP 地址。域名的概念可以類比手機(jī)中的通訊簿,由于手機(jī)號(hào)碼不方便記憶, 所以添加一個(gè)姓名標(biāo)識(shí)號(hào)碼,在實(shí)際撥打電話時(shí)可以選擇該姓名,然后撥打即可。在網(wǎng)絡(luò)中傳輸?shù)臄?shù)據(jù),全部是以IP 地址作為地址標(biāo)識(shí),所以在實(shí)際傳輸數(shù)據(jù)以前需要將域名轉(zhuǎn)換為IP地址,實(shí)現(xiàn)這種功能的服務(wù)

6、器稱之為 DNS服務(wù)器,也就是通俗的說(shuō)法叫做域名解析。例如當(dāng)用戶在瀏覽器輸入域名時(shí),瀏覽器首先請(qǐng)求DNSK務(wù)器,將域名轉(zhuǎn)換為IP地址,然后將轉(zhuǎn)換后的IP地址反饋給瀏覽器,然后再進(jìn)行實(shí)際的數(shù)據(jù)傳輸。當(dāng)DNSK務(wù)器正常工作時(shí),使用IP地址或域名都可以很方便的找到計(jì)算機(jī)網(wǎng)絡(luò)中的某個(gè)設(shè)備,例如服務(wù)器計(jì)算機(jī)。當(dāng) DNW正常工作時(shí),只能通過IP地址訪問該設(shè)備。所以IP 地址的使用要比域名通用一些。IP 地址和域名很好的解決了在網(wǎng)絡(luò)中找到一個(gè)計(jì)算機(jī)的問題,但是為了讓一個(gè)計(jì)算機(jī)可以同時(shí)運(yùn)行多個(gè)網(wǎng)絡(luò)程序,就引入了另外一個(gè)概念端口 (port) 。在介紹端口的概念以前,首先來(lái)看一個(gè)例子,一般一個(gè)公司前臺(tái)會(huì)有一個(gè)電

7、話,每個(gè)員工會(huì)有一個(gè)分機(jī),這樣如果需要找到這個(gè)員工的話,需要首先撥打前臺(tái)總機(jī),然后轉(zhuǎn)該分機(jī)號(hào)即可。這樣減少了公司的開銷,也方便了每個(gè)員工。在該示例中前臺(tái)總機(jī)的電話號(hào)碼就相當(dāng)于IP 地址, 而每個(gè)員工的分機(jī)號(hào)就相當(dāng)于端口。有了端口的概念以后,在同一個(gè)計(jì)算機(jī)中每個(gè)程序?qū)?yīng)唯一的端口,這樣一個(gè)計(jì)算機(jī)上就可以通過端口區(qū)分發(fā)送給每個(gè)端口的數(shù)據(jù)了,換句話說(shuō),也就是一個(gè)計(jì)算機(jī)上可以并發(fā)運(yùn)行多個(gè)網(wǎng)絡(luò)程序,而不會(huì)在互相之間產(chǎn)生干擾。在硬件上規(guī)定,端口的號(hào)碼必須位于0-65535 之間, 每個(gè)端口唯一的對(duì)應(yīng)一個(gè)網(wǎng)絡(luò)程序, 一個(gè)網(wǎng)絡(luò)程序可以使用多個(gè)端口。這樣一個(gè)網(wǎng)絡(luò)程序運(yùn)行在一臺(tái)計(jì)算上時(shí), 不管是客戶端還是服務(wù)器,

8、都是至少占用一個(gè)端口進(jìn)行網(wǎng)絡(luò)通訊。在接收數(shù)據(jù)時(shí),首先發(fā)送給對(duì)應(yīng)的計(jì)算機(jī),然后計(jì)算機(jī)根據(jù)端口把數(shù)據(jù)轉(zhuǎn)發(fā)給對(duì)應(yīng)的程序。有了IP 地址和端口的概念以后,在進(jìn)行網(wǎng)絡(luò)通訊交換時(shí),就可以通過IP 地址查找到該臺(tái)計(jì)算機(jī),然后通過端口標(biāo)識(shí)這臺(tái)計(jì)算機(jī)上的一個(gè)唯一的程序。這樣就可以進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)的交換了。但是,進(jìn)行網(wǎng)絡(luò)編程時(shí),只有IP 地址和端口的概念還是不夠的,下面就介紹一下基礎(chǔ)的網(wǎng)絡(luò)編程相關(guān)的軟件基礎(chǔ)知識(shí)。13.1. 2 網(wǎng)絡(luò)編程概述按照前面的介紹,網(wǎng)絡(luò)編程就是兩個(gè)或多個(gè)設(shè)備之間的數(shù)據(jù)交換,其實(shí)更具體的說(shuō), 網(wǎng)絡(luò)編程就是兩個(gè)或多個(gè)程序之間的數(shù)據(jù)交換,和普通的單機(jī)程序相比,網(wǎng)絡(luò)程序最大的不同就是需要交換數(shù)據(jù)的程序

9、運(yùn)行在不同的計(jì)算機(jī)上,這樣就造成了數(shù)據(jù)交換的復(fù)雜。雖然通過IP 地址和端口可以找到網(wǎng)絡(luò)上運(yùn)行的一個(gè)程序,但是如果需要進(jìn)行網(wǎng)絡(luò)編程,則還需要了解網(wǎng)絡(luò)通訊的過程。網(wǎng)絡(luò)通訊基于“請(qǐng)求 - 響應(yīng)”模型。為了理解這個(gè)模型,先來(lái)看一個(gè)例子,經(jīng)常看電視的人肯定見過審訊的場(chǎng)面吧,一般是這樣的:警察:姓名嫌疑犯: XXX警察:性別嫌疑犯:男警察:年齡嫌疑犯: 29在這個(gè)例子中,警察問一句,嫌疑犯回答一句,如果警察不問,則嫌疑犯保持沉默。這種一問一答的形式就是網(wǎng)絡(luò)中的“請(qǐng)求 -響應(yīng)”模型。也就是通訊的一端發(fā)送數(shù)據(jù),另外一端反饋數(shù)據(jù),網(wǎng)絡(luò)通訊都基于該模型。在網(wǎng)絡(luò)通訊中,第一次主動(dòng)發(fā)起通訊的程序被稱作客戶端(Clie

10、nt) 程序, 簡(jiǎn)稱客戶端, 而在第一次通訊中等待連接的程序被稱作服務(wù)器端(Server) 程序, 簡(jiǎn)稱服務(wù)器。一旦通訊建立,則客戶端和服務(wù)器端完全一樣,沒有本質(zhì)的區(qū)別。由此,網(wǎng)絡(luò)編程中的兩種程序就分別是客戶端和服務(wù)器端,例如QQ程序,每個(gè)QQ8戶安裝的都是Q蛤戶端程序,而QC®務(wù)器端程序則運(yùn)行在騰訊公司的機(jī)房中,為大量的QQ8戶提供服務(wù)。這種網(wǎng)絡(luò)編程的結(jié)構(gòu)被稱作客戶端/服務(wù)器結(jié) 構(gòu),也叫做Client/Server 結(jié)構(gòu),簡(jiǎn)稱C/S結(jié)構(gòu)。使用 C/S 結(jié) 構(gòu)的程序,在開發(fā)時(shí)需要分別開發(fā)客戶端和服務(wù)器端,這種結(jié)構(gòu)的優(yōu)勢(shì)在于由于客戶端是專門開發(fā)的,所以根據(jù)需要實(shí)現(xiàn)各種效果,專業(yè)點(diǎn)說(shuō)就是

11、表現(xiàn)力豐富,而服務(wù)器端也需要專門進(jìn)行開發(fā)。但是這種結(jié)構(gòu)也存在著很多不足,例如通用性差,幾乎不能通用等,也就是說(shuō)一種程序的客戶端只能和對(duì)應(yīng)的服務(wù)器端通訊,而不能和其它服務(wù)器端通訊,在實(shí)際維護(hù)時(shí),也需要維護(hù)專門的客戶端和服務(wù)器端,維護(hù)的壓力比較大。其實(shí)在運(yùn)行很多程序時(shí),沒有必要使用專用的客戶端,而需要使用通用的客戶端,例如瀏覽器,使用瀏覽器作為客戶端的結(jié)構(gòu)被稱作瀏覽器/ 服務(wù)器結(jié)構(gòu),也叫做Browser/Server 結(jié)構(gòu),簡(jiǎn)稱為B/S 結(jié)構(gòu)。使用 B/S 結(jié)構(gòu)的程序,在開發(fā)時(shí)只需要開發(fā)服務(wù)器端即可,這種結(jié)構(gòu)的優(yōu)勢(shì)在于開發(fā)的壓力比較小,不需要維護(hù)客戶端。但是這種結(jié)構(gòu)也存在著很多不足,例如瀏覽器的限

12、制比較大,表現(xiàn)力不強(qiáng),無(wú)法進(jìn)行系統(tǒng)級(jí)操作等。總之 C/S 結(jié)構(gòu)和 B/S 結(jié)構(gòu)是現(xiàn)在網(wǎng)絡(luò)編程中常見的兩種結(jié)構(gòu),B/S 結(jié)構(gòu)其實(shí)也就是一種特殊的C/S 結(jié)構(gòu)。另外簡(jiǎn)單的介紹一下P2P(Pointto Point) 程序,常見的如BK電驢等。P2P程 序是一種特殊的程序,應(yīng)該一個(gè)P2P程序中既包含客戶端程序,也包含服務(wù)器端 程序,例如BT,使用客戶端程序部分連接其它的種子(服務(wù)器端),而使用服務(wù)器端向其它的BT客戶端傳輸數(shù)據(jù)。如果這個(gè)還不是很清楚,其實(shí)P2P程序和手機(jī)是一樣的,當(dāng)手機(jī)撥打電話時(shí)就是使用客戶端的作用,而手機(jī)處于待機(jī)狀態(tài)時(shí),可以接收到其它用戶撥打的電話則起的就是服務(wù)器端的功能,只是一般

13、的手機(jī)不能同時(shí)使用撥打電話和接聽電話的功能,而P2P程序?qū)崿F(xiàn)了該功能。最后再介紹一個(gè)網(wǎng)絡(luò)編程中最重要,也是最復(fù)雜的概念協(xié)議 (Protocol) 。 按照前面的介紹,網(wǎng)絡(luò)編程就是運(yùn)行在不同計(jì)算機(jī)中兩個(gè)程序之間的數(shù)據(jù)交換。在實(shí)際進(jìn)行數(shù)據(jù)交換時(shí),為了讓接收端理解該數(shù)據(jù),計(jì)算機(jī)比較笨,什么都不懂的,那么就需要規(guī)定該數(shù)據(jù)的格式,這個(gè)數(shù)據(jù)的格式就是協(xié)議。如 果沒有理解協(xié)議的概念,那么再舉一個(gè)例子,記得有個(gè)電影叫永不消逝的電波 , 講述的是地下黨通過電臺(tái)發(fā)送情報(bào)的故事,這里我們不探討電影的劇情,而只關(guān) 心電臺(tái)發(fā)送的數(shù)據(jù)。在實(shí)際發(fā)報(bào)時(shí),需要首先將需要發(fā)送的內(nèi)容轉(zhuǎn)換為電報(bào)編碼,然后將電報(bào)編碼發(fā)送出去,而接收端

14、接收的是電報(bào)編碼,如果需要理解電報(bào)的內(nèi)容則需要根據(jù)密碼本翻譯出該電報(bào)的內(nèi)容。這里的密碼本就規(guī)定了一種數(shù)據(jù)格式,這種對(duì)于網(wǎng)絡(luò)中傳輸?shù)臄?shù)據(jù)格式在網(wǎng)絡(luò)編程中就被稱作協(xié)議。那么如何來(lái)編寫協(xié)議格式呢答案是隨意。只要按照這種協(xié)議格式能夠生成唯一的編碼, 按照該編碼可以唯一的解析出發(fā)送數(shù)據(jù)的內(nèi)容即可。也正因?yàn)楦鱾€(gè)網(wǎng)絡(luò)程序之間協(xié)議格式的不同,所以才導(dǎo)致了客戶端程序都是專用的結(jié)構(gòu)。在實(shí)際的網(wǎng)絡(luò)程序編程中,最麻煩的內(nèi)容不是數(shù)據(jù)的發(fā)送和接收,因?yàn)檫@個(gè)功能在幾乎所有的程序語(yǔ)言中都提供了封裝好的API 進(jìn)行調(diào)用,最麻煩的內(nèi)容就是協(xié)議的設(shè)計(jì)以及協(xié)議的生產(chǎn)和解析,這個(gè)才是網(wǎng)絡(luò)編程中最核心的內(nèi)容。關(guān)于網(wǎng)絡(luò)編程的基礎(chǔ)知識(shí),就介

15、紹這里,深刻理解IP 地址、 端口和協(xié)議等概念,將會(huì)極大的有助于后續(xù)知識(shí)的學(xué)習(xí)。13.1.3 網(wǎng)絡(luò)通訊方式在現(xiàn)有的網(wǎng)絡(luò)中,網(wǎng)絡(luò)通訊的方式主要有兩種:1、TCP(傳輸控制協(xié)議)方式2、UDP(用戶數(shù)據(jù)報(bào)協(xié)議)方式為 了方便理解這兩種方式,還是先來(lái)看一個(gè)例子。大家使用手機(jī)時(shí),向別人傳遞信息時(shí)有兩種方式:撥打電話和發(fā)送短信。使用撥打電話的方式可以保證將信息傳遞給別人,因?yàn)閯e人接聽電話時(shí)本身就確認(rèn)接收到了該信息。而發(fā)送短信的方式價(jià)格低廉,使用方便,但是接收人有可能接收不到。在網(wǎng)絡(luò)通訊中,TCP方式就類似于撥打電話,使用該種方式進(jìn)行網(wǎng)絡(luò)通訊時(shí),需要建立專門的虛擬連接,然后進(jìn)行可靠的數(shù)據(jù)傳輸,如果數(shù)據(jù)發(fā)送

16、失敗,則客戶端會(huì)自動(dòng)重發(fā)該數(shù)據(jù)。而UD叨式就類似于發(fā)送短信,使用這種方式進(jìn)行網(wǎng)絡(luò)通訊時(shí), 不需要建立專門的虛擬連接,傳輸也不是很可靠,如果發(fā)送失敗則客戶端無(wú)法獲得。這兩種傳輸方式都是實(shí)際的網(wǎng)絡(luò)編程中進(jìn)行使用,重要的數(shù)據(jù)一般使用TCP方式進(jìn)行數(shù)據(jù)傳輸,而大量的非核心數(shù)據(jù)則都通過UD叨式進(jìn)行傳遞,在一些程 序中甚至結(jié)合使用這兩種方式進(jìn)行數(shù)據(jù)的傳遞。由于TCPB要建立專用的虛擬連接以及確認(rèn)傳輸是否正確,所以使用TCP方式的速度稍微慢一些,而且傳輸時(shí)產(chǎn)生的數(shù)據(jù)量要比 UDPf肖微大一些。關(guān)于網(wǎng)絡(luò)編程的基礎(chǔ)知識(shí)就介紹這么多,如果需要深入了解相關(guān)知識(shí)請(qǐng)閱讀專門的計(jì)算機(jī)網(wǎng)絡(luò)書籍,下面開始介紹Java 語(yǔ)言中

17、網(wǎng)絡(luò)編程的相關(guān)技術(shù)。網(wǎng)絡(luò)編程技術(shù)前面介紹了網(wǎng)絡(luò)編程的相關(guān)基礎(chǔ)知識(shí),初步建立了網(wǎng)絡(luò)編程的概念,但是實(shí)際學(xué)習(xí)網(wǎng)絡(luò)編程還必須使用某種程序設(shè)計(jì)語(yǔ)言進(jìn)行代碼實(shí)現(xiàn),下面就介紹一下網(wǎng)絡(luò)編程的代碼實(shí)現(xiàn)。13.2.1 網(wǎng)絡(luò)編程步驟按照前面的基礎(chǔ)知識(shí)介紹,無(wú)論使用TCP方式還是UDPT式進(jìn)行網(wǎng)絡(luò)通訊,網(wǎng)絡(luò)編程都是由客戶端和服務(wù)器端組成。當(dāng)然,B/S 結(jié)構(gòu)的編程中只需要實(shí)現(xiàn)服務(wù)器端即可。所以,下面介紹網(wǎng)絡(luò)編程的步驟時(shí),均以C/S 結(jié)構(gòu)為基礎(chǔ)進(jìn)行介紹。說(shuō)明:這里的步驟實(shí)現(xiàn)和語(yǔ)言無(wú)關(guān),也就是說(shuō),這個(gè)步驟適用于各種語(yǔ)言實(shí)現(xiàn),不局限于Java 語(yǔ)言。13.2.1.1 客戶端網(wǎng)絡(luò)編程步驟客戶端(Client) 是指網(wǎng)絡(luò)編程中

18、首先發(fā)起連接的程序,客戶端一般實(shí)現(xiàn)程序界面和基本邏輯實(shí)現(xiàn),在進(jìn)行實(shí)際的客戶端編程時(shí),無(wú)論客戶端復(fù)雜還是簡(jiǎn)單,以及客戶端實(shí)現(xiàn)的方式,客戶端的編程主要由三個(gè)步驟實(shí)現(xiàn):1、 建立網(wǎng)絡(luò)連接客戶端網(wǎng)絡(luò)編程的第一步都是建立網(wǎng)絡(luò)連接。在建立網(wǎng)絡(luò)連接時(shí)需要指定連接到的服務(wù)器的IP 地址和端口號(hào),建立完成以后,會(huì)形成一條虛擬的連接,后續(xù)的操作就可以通過該連接實(shí)現(xiàn)數(shù)據(jù)交換了。2、 交換數(shù)據(jù)連接建立以后,就可以通過這個(gè)連接交換數(shù)據(jù)了。交換數(shù)據(jù)嚴(yán)格按照請(qǐng)求響應(yīng)模型進(jìn)行,由客戶端發(fā)送一個(gè)請(qǐng)求數(shù)據(jù)到服務(wù)器,服務(wù)器反饋一個(gè)響應(yīng)數(shù)據(jù)給客戶端,如果客戶端不發(fā)送請(qǐng)求則服務(wù)器端就不響應(yīng)。根據(jù)邏輯需要,可以多次交換數(shù)據(jù),但是還是必須

19、遵循請(qǐng)求響應(yīng)模型。3、 關(guān)閉網(wǎng)絡(luò)連接在數(shù)據(jù)交換完成以后,關(guān)閉網(wǎng)絡(luò)連接,釋放程序占用的端口、內(nèi)存等系統(tǒng)資源,結(jié)束網(wǎng)絡(luò)編程。最基本的步驟一般都是這三個(gè)步驟,在實(shí)際實(shí)現(xiàn)時(shí),步驟 2 會(huì)出現(xiàn)重復(fù),在進(jìn)行代碼組織時(shí),由于網(wǎng)絡(luò)編程是比較耗時(shí)的操作,所以一般開啟專門的現(xiàn)場(chǎng)進(jìn)行網(wǎng)絡(luò)通訊。13.2.1.2 服務(wù)器端網(wǎng)絡(luò)編程步驟服務(wù)器端(Server) 是指在網(wǎng)絡(luò)編程中被動(dòng)等待連接的程序,服務(wù)器端一般實(shí)現(xiàn)程序的核心邏輯以及數(shù)據(jù)存儲(chǔ)等核心功能。服務(wù)器端的編程步驟和客戶端不同,是由四個(gè)步驟實(shí)現(xiàn),依次是:1、 監(jiān)聽端口服務(wù)器端屬于被動(dòng)等待連接,所以服務(wù)器端啟動(dòng)以后,不需要發(fā)起連接,而只需要監(jiān)聽本地計(jì)算機(jī)的某個(gè)固定端口即

20、可。這個(gè)端口就是服務(wù)器端開放給客戶端的端口,服務(wù)器端程序運(yùn)行的本地計(jì)算機(jī)的IP 地址就是服務(wù)器端程序的IP 地址。2、 獲得連接當(dāng)客戶端連接到服務(wù)器端時(shí),服務(wù)器端就可以獲得一個(gè)連接,這個(gè)連接包含客戶端的信息,例如客戶端IP 地址等等,服務(wù)器端和客戶端也通過該連接進(jìn)行數(shù)據(jù)交換。一般在服務(wù)器端編程中,當(dāng)獲得連接時(shí),需要開啟專門的線程處理該連接,每個(gè)連接都由獨(dú)立的線程實(shí)現(xiàn)。3、 交換數(shù)據(jù)服務(wù)器端通過獲得的連接進(jìn)行數(shù)據(jù)交換。服務(wù)器端的數(shù)據(jù)交換步驟是首先接收客戶端發(fā)送過來(lái)的數(shù)據(jù),然后進(jìn)行邏輯處理,再把處理以后的結(jié)果數(shù)據(jù)發(fā)送給客戶端。簡(jiǎn)單來(lái)說(shuō),就是先接收再發(fā)送,這個(gè)和客戶端的數(shù)據(jù)交換數(shù)序不同。其實(shí),服務(wù)器

21、端獲得的連接和客戶端連接是一樣的,只是數(shù)據(jù)交換的步驟不同。當(dāng)然,服務(wù)器端的數(shù)據(jù)交換也是可以多次進(jìn)行的。在數(shù)據(jù)交換完成以后,關(guān)閉和客戶端的連接。4、 關(guān)閉連接當(dāng)服務(wù)器程序關(guān)閉時(shí),需要關(guān)閉服務(wù)器端,通過關(guān)閉服務(wù)器端使得服務(wù)器監(jiān)聽的端口以及占用的內(nèi)存可以釋放出來(lái),實(shí)現(xiàn)了連接的關(guān)閉。其實(shí)服務(wù)器端編程的模型和呼叫中心的實(shí)現(xiàn)是類似的,例如移動(dòng)的客服電話10086就是典型的呼叫中心,當(dāng)一個(gè)用戶撥打10086時(shí),轉(zhuǎn)接給一個(gè)專門的客服人員, 由該客服實(shí)現(xiàn)和該用戶的問題解決,當(dāng)另外一個(gè)用戶撥打10086 時(shí),則轉(zhuǎn)接給另一個(gè)客服,實(shí)現(xiàn)問題解決,依次類推。在服務(wù)器端編程時(shí),10086 這個(gè)電話號(hào)碼就類似于服務(wù)器端的端

22、口號(hào)碼,每個(gè)用戶就相當(dāng)于一個(gè)客戶端程序,每個(gè)客服人員就相當(dāng)于服務(wù)器端啟動(dòng)的專門和客戶端連接的線程,每個(gè)線程都是獨(dú)立進(jìn)行交互的。這就是服務(wù)器端編程的模型,只是TCP方式是需要建立連接的,對(duì)于服務(wù)器端的壓力比較大,而UDP®不需要建立連接的,對(duì)于服務(wù)器端的壓力比較小罷了。13.2.1.3 小結(jié)總之, 無(wú)論使用任何語(yǔ)言,任何方式進(jìn)行基礎(chǔ)的網(wǎng)絡(luò)編程,都必須遵循固定的步驟進(jìn)行操作,在熟悉了這些步驟以后,可以根據(jù)需要進(jìn)行邏輯上的處理,但是還是必須遵循固定的步驟進(jìn)行。其實(shí), 基礎(chǔ)的網(wǎng)絡(luò)編程本身不難,也不需要很多的基礎(chǔ)網(wǎng)絡(luò)知識(shí),只是由于編程的基礎(chǔ)功能都已經(jīng)由API 實(shí)現(xiàn), 而且需要按照固定的步驟進(jìn)行

23、,所以在入門時(shí)有一定的門檻,希望下面的內(nèi)容能夠?qū)⒛憧焖俚膸刖W(wǎng)絡(luò)編程技術(shù)的大門。13.2.2 Java 網(wǎng)絡(luò)編程技術(shù)Java 語(yǔ)言是在網(wǎng)絡(luò)環(huán)境下誕生的,所以 Java 語(yǔ)言雖然不能說(shuō)是對(duì)于網(wǎng)絡(luò)編程的支持最好的語(yǔ)言,但是必須說(shuō)是一種對(duì)于網(wǎng)絡(luò)編程提供良好支持的語(yǔ)言,使用Java 語(yǔ)言進(jìn)行網(wǎng)絡(luò)編程將是一件比較輕松的工作。和網(wǎng)絡(luò)編程有關(guān)的基本API 位于包中,該包中包含了基本的網(wǎng)絡(luò)編程實(shí)現(xiàn),該包是網(wǎng)絡(luò)編程的基礎(chǔ)。該包中既包含基礎(chǔ)的網(wǎng)絡(luò)編程類,也包含封裝后的專門處理WEE?目關(guān)的處理類。在本章中,將只介紹基礎(chǔ)的網(wǎng)絡(luò)編程類。首先來(lái)介紹一個(gè)基礎(chǔ)的網(wǎng)絡(luò)類 InetAddress 類。該類的功能是代表一個(gè)IP地

24、址,并且將IP 地址和域名相關(guān)的操作方法包含在該類的內(nèi)部。關(guān)于該類的使用,下面通過一個(gè)基礎(chǔ)的代碼示例演示該類的使用,代碼如下:package inetaddressdemo;import .*;/* 演示 InetAddress 類的基本使用*/public class InetAddressDemo public static void main(String args) try13.2.3 1.103” 10000);Socket socket2 = new Socket( “上面的代碼中, socket1 實(shí)現(xiàn)的是連接到IP 地址是的計(jì)算機(jī)的10000號(hào)端口,而socket2 實(shí)現(xiàn)的是連

25、接到域名是的計(jì)算機(jī)的 80 號(hào)端口,至于底層網(wǎng)絡(luò)如何實(shí)現(xiàn)建立連接,對(duì)于程序員來(lái)說(shuō)是完全透明的。如果建立連接時(shí),本機(jī)網(wǎng)絡(luò)不通,或服務(wù)器端程序未開啟,則會(huì)拋出異常。連接一旦建立,則完成了客戶端編程的第一步,緊接著的步驟就是按照“請(qǐng)求 - 響應(yīng)”模型進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)交換,在 Java 語(yǔ)言中,數(shù)據(jù)傳輸功能由Java IO實(shí)現(xiàn), 也就是說(shuō)只需要從連接中獲得輸入流和輸出流即可,然后將需要發(fā)送的數(shù)據(jù)寫入連接對(duì)象的輸出流中,在發(fā)送完成以后從輸入流中讀取數(shù)據(jù)即可。示例代碼如下:OutputStream os = (); ;import .*;/* 簡(jiǎn)單的 Socket 客戶端* 功能為:發(fā)送字符串“Hello ”

26、到服務(wù)器端,并打印出服務(wù)器端的反饋* /public class SimpleSocketClient public static void main(String args) Socket socket = null;InputStream is = null;OutputStream os = null;java和下面將要介紹的SimpleSocketServer 服務(wù)器端組合運(yùn)行時(shí),程序的輸出結(jié)果為:服務(wù)器反饋:Hello介紹完一個(gè)簡(jiǎn)單的客戶端編程的示例,下面接著介紹一下TCP類型的服務(wù)器端的編寫。首先需要說(shuō)明的是,客戶端的步驟和服務(wù)器端的編寫步驟不同,所以在學(xué)習(xí)服務(wù)器端編程時(shí)注意不要和

27、客戶端混淆起來(lái)。在服務(wù)器端程序編程中,由于服務(wù)器端實(shí)現(xiàn)的是被動(dòng)等待連接,所以服務(wù)器端編程的第一個(gè)步驟是監(jiān)聽端口,也就是監(jiān)聽是否有客戶端連接到達(dá)。實(shí)現(xiàn)服務(wù)器端監(jiān)聽的代碼為:ServerSocket ss = new ServerSocket(10000);該代碼實(shí)現(xiàn)的功能是監(jiān)聽當(dāng)前計(jì)算機(jī)的10000號(hào)端口, 如果在執(zhí)行該代碼時(shí),10000號(hào)端口已經(jīng)被別的程序占用,那么將拋出異常。否則將實(shí)現(xiàn)監(jiān)聽。服務(wù)器端編程的第二個(gè)步驟是獲得連接。該步驟的作用是當(dāng)有客戶端連接到達(dá)時(shí), 建立一個(gè)和客戶端連接對(duì)應(yīng)的Socket 連 接對(duì)象, 從而釋放客戶端連接對(duì)于服務(wù)器端端口的占用。實(shí)現(xiàn)功能就像公司的前臺(tái)一樣,當(dāng)一個(gè)

28、客戶到達(dá)公司時(shí),會(huì)告訴前臺(tái)我找某某某,然后前臺(tái)就通知某某某,然后就可以繼續(xù)接待其它客戶了。 通過獲得連接,使得客戶端的連接在服務(wù)器端獲得了保持,另外使得服務(wù)器端的端口釋放出來(lái),可以繼續(xù)等待其它的客戶端連接。實(shí)現(xiàn)獲得連接的代碼是:Socket socket = ();該代碼實(shí)現(xiàn)的功能是獲得當(dāng)前連接到服務(wù)器端的客戶端連接。需要說(shuō)明的是accept和前面IO部分介紹的read方法一樣,都是一個(gè)阻塞方法,也就是當(dāng)無(wú)連接時(shí), 該方法將阻塞程序的執(zhí)行,直到連接到達(dá)時(shí)才執(zhí)行該行代碼。另外獲得的連接會(huì)在服務(wù)器端的該端口注冊(cè),這樣以后就可以通過在服務(wù)器端的注冊(cè)信息直接通信,而注冊(cè)以后服務(wù)器端的端口就被釋放出來(lái),

29、又可以繼續(xù)接受其它的連接了。連接獲得以后,后續(xù)的編程就和客戶端的網(wǎng)絡(luò)編程類似了,這里獲得的Socket 類型的連接就和客戶端的網(wǎng)絡(luò)連接一樣了,只是服務(wù)器端需要首先讀取發(fā)送過來(lái)的數(shù)據(jù),然后進(jìn)行邏輯處理以后再發(fā)送給客戶端,也就是交換數(shù)據(jù)的順序和客戶端交換數(shù)據(jù)的步驟剛好相反。這部分的內(nèi)容和客戶端很類似,所以就不重復(fù)了,如果還不熟悉,可以參看下面的示例代碼。最后,在服務(wù)器端通信完成以后,關(guān)閉服務(wù)器端連接。實(shí)現(xiàn)的代碼為:();這就是基本的TC談型的服務(wù)器端編程步驟。下面以一個(gè)簡(jiǎn)單的echo服務(wù)實(shí)現(xiàn)為例子,介紹綜合使用示例。echo 的意思就是“回聲”, echo 服務(wù)器端實(shí)現(xiàn)的功能就是將客戶端發(fā)送的內(nèi)容

30、再原封不動(dòng)的反饋給客戶端。實(shí)現(xiàn)的代碼如 下:package tcp;import .*;import .*;/* echo 服務(wù)器* 功能:將客戶端發(fā)送的內(nèi)容反饋給客戶端* /public class SimpleSocketServer public static void main(String args) ServerSocket serverSocket = null;Socket socket = null;OutputStream os = null;InputStream is = null;Jimport .*;/* 復(fù)用連接的Socket 客戶端* 功能為:發(fā)送字符串“Hel

31、lo ”到服務(wù)器端, 并打印出服務(wù)器端的反饋* /public class MulSocketClient public static void main(String args) Socket socket = null;InputStream is = null;OutputStream os = null;etBytes();Jimport .*;/* 復(fù)用連接的echo 服務(wù)器* 功能:將客戶端發(fā)送的內(nèi)容反饋給客戶端* /public class MulSocketServer public static void main(String args) ServerSocket serv

32、erSocket = null;Socket socket = null;OutputStream os = null;InputStream is = null;import .*;/* 服務(wù)器端邏輯線程*/public class LogicThread extends Thread Socket socket;InputStream is;OutputStream os;public LogicThread(Socket socket) = socket;start(); 0.1”int port = 10001;Jimport .*;/*簡(jiǎn)單的UD哈戶端,實(shí)現(xiàn)向服務(wù)器端發(fā)生系統(tǒng)時(shí)間功能

33、*/public class SimpleUDPClient public static void main(String args) DatagramSocket ds = null; ;/* *簡(jiǎn)單UDP®務(wù)器端,實(shí)現(xiàn)功能是輸出客戶端發(fā)送數(shù)據(jù),并反饋?zhàn)址?quot; OK"合客戶端*/ public class SimpleUDPServer public static void main(String args) DatagramSocket ds = null; ;import .*;/*簡(jiǎn)單的UD哈戶端,實(shí)現(xiàn)向服務(wù)器端發(fā)生系統(tǒng)時(shí)間功能* 該程序發(fā)送3 次數(shù)據(jù)到服

34、務(wù)器端*/public class MulUDPClient public static void main(String args) DatagramSocket ds = null; ;/* * 可以并發(fā)處理數(shù)據(jù)包的服務(wù)器端OK”* 功能為:顯示客戶端發(fā)送的內(nèi)容,并向客戶端反饋?zhàn)址?/ public class MulUDPServer public static void main(String args) DatagramSocket ds = null; ;/* * 邏輯處理線程*/ public class LogicThread extends Thread Datagram

35、Socket ds;/* 接收到的數(shù)據(jù)包*/DatagramPacket dp;public LogicThread(DatagramSocket ds,DatagramPacket dp)= ds;= dp;start(); etBytes();DatagramPacket sendDp = newDatagramPacket(b,clientAddress,clientPort);432” 0” 1” - 110” 0” 5” 13.2.613.3.1;import .*;/*以TCP方式實(shí)現(xiàn)的質(zhì)數(shù)判斷客戶端程序*/public class TCPPrimeClient static Bu

36、fferedReader br;static Socket socket;static InputStream is;static OutputStream os;/* 服務(wù)器 IP*/final static String HOST = ""/* 服務(wù)器端端口*/final static int PORT = 10005;public static void main(String args) init(); etBytes();send(b);break; qualsIgnoreCase(input)return true;elsereturn false;/* 校驗(yàn)輸

37、入* param input 用戶輸入內(nèi)容* return true 代表輸入符合要求,false 代表不符合*/private static boolean checkInput(String input)if(input = null)return false;tryint n = (input);if(n >= 2) return true;elsereturn false;catch(Exception e)return false; ;/*以TCP方式實(shí)現(xiàn)的質(zhì)數(shù)判別服務(wù)器端*/ public class TCPPrimeServer public static void mai

38、n(String args) final int PORT = 10005;ServerSocket ss = null;try ss = new ServerSocket(PORT);" 服務(wù)器端已啟動(dòng):");while(true)Socket s = ();new PrimeLogicThread(s); catch (Exception e) finallytry (); catch (Exception e2) package example1;import .*;import .*;/* 實(shí)現(xiàn)質(zhì)數(shù)判別邏輯的線程*/public class PrimeLogicTh

39、read extends Thread Socket socket;InputStream is;OutputStream os;public PrimeLogicThread(Socket socket)= socket;init();run();/* * 初始化*/ private void init() try is = ();os = ();catch(Exception e) public void run() while(true) import .*;/* * 猜數(shù)字客戶端*/ public class TCPClient public static void main(String args) Socket socket = null;OutputStream os = null;InputStream is = null;Buff

溫馨提示

  • 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論