




已閱讀5頁(yè),還剩23頁(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)介
目錄摘要2前言4第1章 JAVA概述51.1 JAVA 簡(jiǎn)介51.2 Java的特性61.2.1 Java中輸入/輸出流概念61.2.2 Socket 機(jī)制61.2.3 Java語(yǔ)言71.2.4 JAVA工具8第2章 如何使用JAVA來(lái)進(jìn)行網(wǎng)絡(luò)編程102.1使用JAVA來(lái)進(jìn)行網(wǎng)絡(luò)編程102.2客戶機(jī)/服務(wù)器通信的動(dòng)機(jī)102.3服務(wù)器的特權(quán)和復(fù)雜性112.4無(wú)連接的和面向無(wú)連接的服務(wù)器112.5無(wú)狀態(tài)的和有狀態(tài)的服務(wù)器12第3章 網(wǎng)絡(luò)通信程序的編寫143.1客戶機(jī)和服務(wù)器143.2客戶機(jī)/服務(wù)器通信的實(shí)現(xiàn)143.3客戶機(jī)-服務(wù)器范例的應(yīng)用163.4 Application 同 Applet 的通信163.5 Applet之間的通信163.6程序17第4章 程序調(diào)試25后記26參考文獻(xiàn)27湖北廣播電視大學(xué)摘 要Java是當(dāng)前最流行的程序設(shè)計(jì)語(yǔ)言之一,它的出現(xiàn)大大地促進(jìn)了軟件產(chǎn)業(yè)和互聯(lián)網(wǎng)的發(fā)展。Java之所以如此地流行是因?yàn)樗且环N簡(jiǎn)單易學(xué)易用的、純面向?qū)ο蟮摹⒖梢浦驳?、安全的、高效的、健壯的、分布式的、多線程的、結(jié)構(gòu)中立的、可解釋執(zhí)行的動(dòng)態(tài)語(yǔ)言。Java擁有包括Sun、IBM在內(nèi)的世界各大軟件廠商的支持,因而發(fā)展迅速。隨著計(jì)算機(jī)技術(shù)的發(fā)展,網(wǎng)絡(luò)通信顯得越來(lái)越重要.計(jì)算機(jī)技術(shù)越成熟,對(duì)通信的要求越高,本論文主要闡述了使用JAVA編程語(yǔ)言對(duì)基于客戶/服務(wù)器模式的應(yīng)用編寫網(wǎng)絡(luò)通信程序以及介紹了Application 同 Applet 的通信和Applet之間的通信,討論了SOCKET機(jī)制、Java中輸入輸出流以及程序?qū)崿F(xiàn)代碼。關(guān)鍵詞:JAVA,網(wǎng)絡(luò),SOCKET,客戶/服務(wù)器,APPLETAbstractJava is the most popular programming language, one of which has significantly contributed to the development of software industry and the Internet. Java is so popular is because it is in a simple and easy to learn, and pure object-oriented, portable, safe, efficient, robust, distributed, multi-threaded, structure neutral, can interpreted dynamic language. Java has, including Sun, IBM, including the worlds major software vendors support it, which is developing rapidly. With the development of computer technology, network communications become more and more important. The more sophisticated computer technology, the higher the communication of requirements, present paper mainly elaborates on the use of JAVA programming language based on Client / Server Application network communication procedures and the the Application of communication with the Applet and Applet communication between the discussed SOCKET mechanism, Java in the input and output streams and program implementation code. Keywords: JAVA, Internet, SOCKET, client / server, APPLET前 言Java作為在Internet上最流行的編程語(yǔ)言,其發(fā)展非常迅速。從1995年誕生以來(lái),經(jīng)過(guò)短短的幾年發(fā)展,如今它已不僅僅是一門語(yǔ)言,而已發(fā)展為一門技術(shù),包括Java的芯片技術(shù)、Java的編譯技術(shù)、Java的數(shù)據(jù)庫(kù)連接技術(shù)、基于Java的信息家電的聯(lián)網(wǎng)技術(shù)、企業(yè)信息服務(wù)的綜合求解方案技術(shù)等等。Java語(yǔ)言作為一種優(yōu)秀的面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言,具有平臺(tái)無(wú)關(guān)性、安全機(jī)制、高可靠性和內(nèi)嵌的網(wǎng)絡(luò)支持等特點(diǎn)。由于Java語(yǔ)言的這些特點(diǎn),使得Java語(yǔ)言成為當(dāng)前網(wǎng)絡(luò)應(yīng)用程序編寫的首選工具之一。還有人預(yù)言,不久的將來(lái),全世界90%的程序代碼將用Java語(yǔ)言重寫和改寫。Java語(yǔ)言和技術(shù)的大量使用也促使Java語(yǔ)言本身不斷發(fā)展。本論文是面向高職??茖W(xué)生及其他對(duì)Java語(yǔ)言和面向?qū)ο缶幊碳夹g(shù)感興趣的讀者的。學(xué)習(xí)本論文前應(yīng)對(duì)計(jì)算機(jī)有一定的認(rèn)識(shí),最好了解DOS、Windows等系統(tǒng)的基礎(chǔ)操作??梢詫⒈緯鳛榈谝婚T開(kāi)發(fā)語(yǔ)言來(lái)學(xué)習(xí),獲得開(kāi)發(fā)程序的初步經(jīng)驗(yàn)。對(duì)有其他高級(jí)語(yǔ)言編程經(jīng)驗(yàn)的讀者,學(xué)習(xí)本文也會(huì)感到得心應(yīng)手,從中領(lǐng)略Java語(yǔ)言面向?qū)ο?、易學(xué)易用的特點(diǎn)。本文第介紹了面向?qū)ο蟮囊恍┗靖拍?,引出兩種Java程序的介紹,并簡(jiǎn)述了Java程序的結(jié)構(gòu)和開(kāi)發(fā)過(guò)程。介紹Java語(yǔ)言編程的基礎(chǔ)知識(shí),包括一般程序設(shè)計(jì)語(yǔ)言的大部分內(nèi)容,有基本數(shù)據(jù)類型、常量、變量、運(yùn)算符、表達(dá)式和流程控制語(yǔ)句、方法(函數(shù))等,還介紹了如何使用Java語(yǔ)言初步編寫網(wǎng)絡(luò)通信程序。計(jì)算機(jī)語(yǔ)言的學(xué)習(xí)應(yīng)是課堂學(xué)習(xí)和上機(jī)實(shí)驗(yàn)的有機(jī)結(jié)合,特別要重視上機(jī)實(shí)驗(yàn)的環(huán)節(jié)。優(yōu)秀的軟件開(kāi)發(fā)人員都有大量上機(jī)編程的經(jīng)驗(yàn),從實(shí)踐中可學(xué)到很多文中沒(méi)有的東西。第一章 JAVA概述1.1 JAVA 簡(jiǎn)介 Java是由Sun Microsystems 公司于1995年5月推出的Java程序設(shè)計(jì)語(yǔ)言所發(fā)展出來(lái)的程序語(yǔ)言(以下簡(jiǎn)稱Java語(yǔ)言或JAVA),它本身是一種對(duì)象導(dǎo)向(Object-Oriented )的程序語(yǔ)言。JAVA目前在手機(jī)上且應(yīng)用最多的就是手機(jī)Java游戲。Java也號(hào)稱是能跨平臺(tái)使用的語(yǔ)言,這主要是因?yàn)镴ava本身被編譯之后,并不是直接產(chǎn)生可執(zhí)行的碼,而是產(chǎn)生一種中間碼叫作 ByteCode,這種碼必需在透過(guò) Java 的直譯器來(lái)解讀它,才能夠真正的被執(zhí)行,所以只要平臺(tái)上裝有這種Java的直譯器,就能解讀 ByteCode 也就能執(zhí)行 Java 編譯過(guò)的程序,故與Java程序是在那種平臺(tái)上被編譯的,就完全沒(méi)有干系了。Java 寫出來(lái)的程序可分為兩類,分別是Java Applet 與一般的Application,而Application 這一類就與一般的程序如C+ 的作用是比較類似的,是一個(gè)獨(dú)立可執(zhí)行的應(yīng)用程序,像HotJava是一個(gè)瀏覽器,且就是使用Java 程序所發(fā)展出來(lái)的。最常見(jiàn)的Java程序包括應(yīng)用程序和Applets。應(yīng)用程序是單獨(dú)的程序,諸如HotJava 瀏覽器軟件就是用Java語(yǔ)言編寫的。 Applets 類似于應(yīng)用程序,但是它們不能單獨(dú)運(yùn)行,Applets可以在支持Java的瀏覽器中運(yùn)行。Applet主要是內(nèi)置于HTML網(wǎng)頁(yè)中,在瀏覽時(shí)發(fā)揮作用。Java的目標(biāo)是為了滿足在一個(gè)充滿各式各樣不同種機(jī)器,不同操作系統(tǒng)平臺(tái)的網(wǎng)絡(luò)環(huán)境中開(kāi)發(fā)軟件。利用Java程序語(yǔ)言,可以在網(wǎng)頁(yè)中加入各式各樣的動(dòng)態(tài)效果。可以放上一段動(dòng)畫,加入聲音,也可以建立交互式網(wǎng)頁(yè)等。Java手機(jī)軟件平臺(tái),Java手機(jī)軟件平臺(tái)采用的基本Java平臺(tái)是CLDC (Connected Limited Device Configuration)和MIDP (Mobile Information Device Profile),是J2ME (Java 2 Micro Edition)的一部分,在中國(guó)一般稱為“無(wú)線Java”技術(shù)。此前,有人把它叫做“K-Java”;其實(shí),K-Java的叫法只是Sun公司在開(kāi)發(fā)KVM Java虛擬機(jī)時(shí)的項(xiàng)目代號(hào),在該技術(shù)被正式命名為KVM后,就不再用K-Java了。KJava即J2ME(Java 2 Micro Edition),是Sun公司專門用于嵌入式設(shè)備的Java軟件。以KJava編程語(yǔ)言為手機(jī)開(kāi)發(fā)應(yīng)用程序,可以為手機(jī)用戶提供游戲、個(gè)人信息處理、電子地圖、股票等服務(wù)程序。J2ME (Java 2 Micro Edition)是致力于消費(fèi)產(chǎn)品和嵌入式設(shè)備的最佳解決方案。J2ME在設(shè)計(jì)其規(guī)格的時(shí)候,遵循著“對(duì)于各種不同的裝置而造出一個(gè)單一的開(kāi)發(fā)系統(tǒng)是沒(méi)有意義的事”這個(gè)基本原則。于是J2ME先將所有的嵌入式裝置大體上區(qū)分為兩種:一種是運(yùn)算功能有限、電力供應(yīng)也有限的嵌入式裝置(比方說(shuō)PDA、手機(jī));另外一種是運(yùn)算能力相對(duì)較佳、并且在電力供應(yīng)上相對(duì)比較充足的嵌入式裝置(比方說(shuō)冷氣機(jī)、電冰箱)。因?yàn)檫@兩種區(qū)分,所以Java引入了一個(gè)叫做Configuration的概念,然后把上述運(yùn)算功能有限、電力有限的嵌入式裝置定義在Connected Limited Device Configuration(CLDC)規(guī)格之中;而另外一種裝置則規(guī)范為Connected Device Configuration(CDC)規(guī)格。也就是說(shuō),J2ME先把所有的嵌入式裝置利用Configuration的概念區(qū)隔成兩種抽象的型態(tài)。1.2 Java的特性 Java技術(shù)的開(kāi)放性、安全性和龐大的社會(huì)已有資源,以及其跨平臺(tái)性,即“編寫一次,到處運(yùn)行”的特點(diǎn),使Java技術(shù)成為智能手機(jī)軟件平臺(tái)的事實(shí)標(biāo)準(zhǔn)。采用Java技術(shù)后,編寫應(yīng)用程序和提供服務(wù)的人就不必關(guān)心接受其服務(wù)的手機(jī)采用的是什么操作系統(tǒng)和芯片,只要按照J(rèn)ava的要求去寫程序就好了;同樣,生產(chǎn)手機(jī)的廠商也不必顧慮將來(lái)誰(shuí)來(lái)提供增值服務(wù)??梢钥闯觯捎肑ava技術(shù),可以建立完整、高效的無(wú)線數(shù)據(jù)增值服務(wù)產(chǎn)業(yè)鏈,從而為用戶提供靈活、個(gè)性化、內(nèi)容方式多樣的服務(wù)。1.2.1 Java中輸入/輸出流概念過(guò)濾流DataInputStream 和DataOutputStream 除了分別作為FilterInputStream 和FilterOutputStream的子類外,還分別實(shí)現(xiàn)了接口DataInput 和DataOutput。接口DataInput 中定義的方法主要包括從流中讀取基本類型的數(shù)據(jù)、讀取一行數(shù)據(jù)、或者讀取指定長(zhǎng)度的字節(jié)數(shù),如readBoolean() readInt()、readLine()、readFully()等。接口DataOutput中定義的方法主要是向流中寫入基本類型的數(shù)據(jù)或者寫入一定長(zhǎng)度的字節(jié)數(shù)組,如writeChar()、writeDouble() DataInputStream可以從所連接的輸入流中讀取與機(jī)器無(wú)關(guān)的基本類型數(shù)據(jù),用以實(shí)現(xiàn)一種獨(dú)立于具體平臺(tái)的輸入方式;DataInputStream 可以向所連接的輸出流寫入基本類型的數(shù)據(jù)。1.2.2 Socket 機(jī)制Socket是面向客戶/服務(wù)器模型設(shè)計(jì)的,網(wǎng)絡(luò)上的兩個(gè)程序通過(guò)一個(gè)雙向的通訊連接實(shí)現(xiàn)數(shù)據(jù)的交換,這個(gè)雙向鏈路的一端稱為一個(gè)Socket。 Socket通常用來(lái)實(shí)現(xiàn)客戶方和服務(wù)方的連接??蛻舫绦蚩梢韵騍ocket寫請(qǐng)求,服務(wù)器將處理此請(qǐng)求,然后通過(guò)Socket將結(jié)果返回給用戶。Socket通信機(jī)制提供了兩種通訊方式:有聯(lián)接和無(wú)聯(lián)接方式,分別面向不同的應(yīng)用需求。使用有聯(lián)接方式時(shí),通信鏈路提供了可靠的,全雙工的字節(jié)流服務(wù)。在該方式下,通信雙方必須創(chuàng)建一個(gè)聯(lián)接過(guò)程并建立一條通訊鏈路,以后的網(wǎng)絡(luò)通信操作完全在這一對(duì)進(jìn)程之間進(jìn)行,通信完畢關(guān)閉此聯(lián)接過(guò)程。使用無(wú)聯(lián)接方式時(shí)其系統(tǒng)開(kāi)銷比無(wú)聯(lián)接方式小,但通信鏈路提供了不可靠的數(shù)據(jù)報(bào)服務(wù),不能保證信源所傳輸?shù)臄?shù)據(jù)一定能夠到達(dá)信宿。在該方式下,通信雙方不必創(chuàng)建一個(gè)聯(lián)接過(guò)程和建立一條通訊鏈路,網(wǎng)絡(luò)通信操作在不同的主機(jī)和進(jìn)程之間轉(zhuǎn)發(fā)進(jìn)行。1.2.3 Java語(yǔ)言Java語(yǔ)言的優(yōu)點(diǎn)主要表現(xiàn)在:簡(jiǎn)單、面向?qū)ο?、多線程、分布性、體系結(jié)構(gòu)中立、安全性等方面。(1) 簡(jiǎn)單性Java與C+語(yǔ)言非常相近,但Java比C+簡(jiǎn)單,它拋棄了C+中的一些不是絕對(duì)必要的功能,如頭文件、預(yù)處理文件、指針、結(jié)構(gòu)、運(yùn)算符重載、多重繼承以及自動(dòng)強(qiáng)迫同型。 Java實(shí)現(xiàn)了自動(dòng)的垃圾收集,簡(jiǎn)化了內(nèi)存管理的工作。這使程序設(shè)計(jì)更加簡(jiǎn)便,同時(shí)減少了出錯(cuò)的可能。(2) 面向?qū)ο驤ava提供了簡(jiǎn)單的類機(jī)制和動(dòng)態(tài)的構(gòu)架模型。對(duì)象中封裝了它的狀態(tài)變量和方法,很好地實(shí)現(xiàn)了模塊化和信息隱藏;而類則提供了一類對(duì)象的原型,通過(guò)繼承和重載機(jī)制,子類可以使用或重新定義父類或超類所提供的方法,從而既實(shí)現(xiàn)了代碼的復(fù)用,又提供了一種動(dòng)態(tài)的解決方案。Java是一種完全面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言,它除了數(shù)組、布爾和字符三個(gè)基本數(shù)據(jù)類型外的其它類都是對(duì)象,它不再支持全局變量。在Java中,如果不創(chuàng)建新類就無(wú)法創(chuàng)建程序,Java程序在運(yùn)行時(shí)必須先創(chuàng)建一個(gè)類的實(shí)例,然后才能提交運(yùn)行。Java同樣支持繼承特性,Java的類可以從其它類中繼承行為,但Java只支持類的單重繼承,即每個(gè)類只能從一個(gè)類中繼承。Java支持界面,界面允許程序員定義方法但又不立即實(shí)現(xiàn),一個(gè)類可以實(shí)現(xiàn)多個(gè)界面,利用界面可以得到多重繼承的許多優(yōu)點(diǎn)而又沒(méi)有多重繼承的問(wèn)題。(3) 多線程多線程使應(yīng)用程序可以同時(shí)進(jìn)行不同的操作,處理不同的事件。在多線程機(jī)制中,不同的線程處理不同的任務(wù),他們之間互不干涉,不會(huì)由于一處等待影響其他部分,這樣容易實(shí)現(xiàn)網(wǎng)絡(luò)上的實(shí)時(shí)交互操作。Java程序可以有多個(gè)執(zhí)行線程,如可以讓一個(gè)線程進(jìn)行復(fù)雜的計(jì)算,而讓另一個(gè)線程與用戶進(jìn)行交互,這樣用戶可以在不中斷計(jì)算線程的前提下與系統(tǒng)進(jìn)行交互。多線程保證了較高的執(zhí)行效率。 (4) 分布性Java是面向網(wǎng)絡(luò)的語(yǔ)言。通過(guò)它提供的類庫(kù)可以處理TCP/IP協(xié)議,用戶可以通過(guò)URL地址在網(wǎng)絡(luò)上很方便的訪問(wèn)其他對(duì)象。(5) 體系結(jié)構(gòu)中立Java是一種網(wǎng)絡(luò)語(yǔ)言,為使Java程序能在網(wǎng)絡(luò)的任何地方運(yùn)行,Java解釋器生成與體系結(jié)構(gòu)無(wú)關(guān)的字節(jié)碼結(jié)構(gòu)的文件格式。Java為了做到結(jié)構(gòu)中立,除生成機(jī)器無(wú)關(guān)的字節(jié)碼外,還制定了完全統(tǒng)一的語(yǔ)言文本,如Java的基本數(shù)據(jù)類型不會(huì)隨目標(biāo)機(jī)的變化而變化,一個(gè)整型總是32位,一個(gè)長(zhǎng)整型總是64位。為了使Java的應(yīng)用程序能不依賴于具體的系統(tǒng),Java語(yǔ)言環(huán)境還提供了用于訪問(wèn)底層操作系統(tǒng)功能的類組成的包,當(dāng)程序使用這些包時(shí),可以確保它能運(yùn)行在各種支持Java的平臺(tái)上。java.lang: 一般的語(yǔ)言包。其中包括用于字符串處理、多線程、異常處理和數(shù)字函數(shù)等的類,該包是實(shí)現(xiàn)Java程序運(yùn)行平臺(tái)的基本包java.util: 實(shí)用工具包。其中包括哈希表、堆棧、時(shí)間和日期等java.io: 基于流模型的輸入/輸出包。該包用統(tǒng)一的流模型實(shí)現(xiàn)了各種格式的輸入/輸出,包括文件系統(tǒng)、網(wǎng)絡(luò)和設(shè)備的輸入/輸出等: 網(wǎng)絡(luò)包。該包支持TCP/IP協(xié)議,其中提供了socket、URL和WWW的編程接口。java.awt: 抽象窗口工具集。其中實(shí)現(xiàn)了可以跨平臺(tái)的圖形用戶界面組件,包括窗口、菜單、滾動(dòng)條和對(duì)話框等。java.applet: 支持applet程序設(shè)計(jì)的基本包。(6) 安全性用于網(wǎng)絡(luò)、分布環(huán)境下的Java必須要防止病毒的入侵,Java不支持指針,一切對(duì)內(nèi)存的訪問(wèn)都必須通過(guò)對(duì)象的實(shí)例變量來(lái)實(shí)現(xiàn),這樣就防止了程序員使用欺騙手段訪問(wèn)對(duì)象的私有成員,同時(shí)也避免了指針操作中容易產(chǎn)生的錯(cuò)誤。1.2.4 JAVA工具1 JDK(1) Java編譯器Java編譯器將Java源代碼文件編譯成可執(zhí)行的Java字節(jié)碼。Java源代碼文件的擴(kuò)展名為 .java,Java編譯器把這種擴(kuò)展名的文件編譯成擴(kuò)展名為.class的文件。源文件中的每個(gè)類在編譯后都將產(chǎn)生一個(gè)class文件,這意味一個(gè)Java源代碼文件可能編譯生成多個(gè)class文件。(2) Java解釋器Java解釋器對(duì)編譯生成的字節(jié)碼格式的可執(zhí)行程序的運(yùn)行提供支持,它是運(yùn)行非圖形Java程序的命令行工具。(3) Appletviewer它是Java Applet的簡(jiǎn)單測(cè)試工具,可使用它來(lái)測(cè)試Java Applet程序,而不需要WWW瀏覽器的支持。2 Visual J+Visual J+ 集成了可視化界面設(shè)計(jì)、交互式調(diào)試、代碼編輯、聯(lián)機(jī)幫助信息和介紹如何快速掌握該開(kāi)發(fā)環(huán)境的實(shí)用向?qū)У榷囗?xiàng)功能,同時(shí)具有能充分利用Active X和COM新技術(shù)的優(yōu)勢(shì)。利用Visual J+可創(chuàng)建交互性很強(qiáng)的Internet應(yīng)用程序,是難得的Java 開(kāi)發(fā)系統(tǒng)。網(wǎng)絡(luò)上的系統(tǒng)結(jié)構(gòu)多為客戶/服務(wù)器模式,服務(wù)器端負(fù)責(zé)數(shù)據(jù)和圖像等的存儲(chǔ)、維護(hù)、管理以及傳遞,客戶端則負(fù)責(zé)人機(jī)界面的操作、送出需求及顯示收回的數(shù)據(jù)。第二章 如何使用JAVA來(lái)進(jìn)行網(wǎng)絡(luò)編程2.1使用JAVA來(lái)進(jìn)行網(wǎng)絡(luò)編程1) 由于客戶端通過(guò)IE同服務(wù)器建立聯(lián)系,所以客戶端使用Applet,服務(wù)器端使用Application;2) 服務(wù)器應(yīng)設(shè)置成多線程,應(yīng)答多個(gè)客戶的請(qǐng)求;3) 兩端通信使用SOCKET機(jī)制。2.2客戶機(jī)/服務(wù)器通信的動(dòng)機(jī)客戶機(jī)-服務(wù)器范例的基本動(dòng)機(jī)來(lái)自聚集問(wèn)題。為了理解這一 問(wèn)題,設(shè)想一個(gè)人試圖在分離的機(jī)器上啟動(dòng)兩個(gè)程序并讓它們進(jìn)行通信,還要記住,計(jì)算機(jī)的運(yùn)行要比人的速度快許多數(shù)量級(jí)。在某人啟動(dòng)第一個(gè)程序后,該程序開(kāi)始執(zhí)行并向其對(duì)等程序發(fā)送消息,在幾個(gè)微妙內(nèi),它便發(fā)現(xiàn)對(duì)等程序還不存在,于是就發(fā)出一條錯(cuò)誤消息,然后退出。在這時(shí),某個(gè)人啟動(dòng)了第二個(gè)程序,不幸的是,當(dāng)?shù)诙€(gè)程序開(kāi)始執(zhí)行時(shí),它發(fā)現(xiàn)對(duì)等程序已經(jīng)終止執(zhí)行了,即便是兩個(gè)程序連續(xù)重新試著通信,但由于它們每個(gè)程序執(zhí)行的速度那么快。因而它們?cè)谕凰查g向?qū)Ψ桨l(fā)送消息的概率是很低的。 客戶機(jī)-服務(wù)器模型是這樣解決這種聚集問(wèn)題的。它要求在任何一對(duì)進(jìn)行通信的應(yīng)用進(jìn)程中,有一方必須在啟動(dòng)執(zhí)行后(無(wú)限期地)等待對(duì)方的聯(lián)系,這種解決方案是重要的,因?yàn)門CP/IP自己對(duì)入呼叫通信是不會(huì)響應(yīng)的。 由于TCP/IP并不是提供在一個(gè)報(bào)文到達(dá)后自動(dòng)創(chuàng)建運(yùn)行程序的任何機(jī)制,因此一個(gè)程序必須在任一請(qǐng)求到來(lái)前就在那里等待以接受通信。 因此,為確保計(jì)算機(jī)已準(zhǔn)備好了進(jìn)行通信,多數(shù)系統(tǒng)管理員都安排通信程序在操作系統(tǒng)引導(dǎo)時(shí)就自動(dòng)啟動(dòng)。每個(gè)程序都一直運(yùn)行下去,以便等待下一個(gè)服務(wù)請(qǐng)求的到來(lái)(此服務(wù)是該程序提供的)。 2.3服務(wù)器的特權(quán)和復(fù)雜性由于服務(wù)器軟件往往需要訪問(wèn)操作系統(tǒng)保護(hù)的數(shù)據(jù)、計(jì)算以及協(xié)議端口,因此服務(wù)器軟件經(jīng)常需要一些特定的系統(tǒng)特權(quán)。因?yàn)榉?wù)器軟件的執(zhí)行帶有特定的系統(tǒng)特權(quán),為保證這樣不會(huì)粗心地將特權(quán)傳遞給使用它的客戶機(jī),必須要小心行事。例如,一個(gè)作為特權(quán)程序運(yùn)行的文件服務(wù)器,它必須要含有這樣的程序代碼,以檢查某個(gè)給定的文件是否可以被某個(gè)給定的客戶機(jī)訪問(wèn),服務(wù)器不能依賴那些通常的操作系統(tǒng)檢查,這是因?yàn)樗奶貦?quán)狀態(tài)將不理會(huì)那些檢查。 服務(wù)器必須含有處理以下問(wèn)題的代碼: 鑒別驗(yàn)證客戶機(jī)的身份 授權(quán)確定某個(gè)給定的客戶機(jī)是否被允許訪問(wèn)服務(wù)器所提供的服務(wù) 數(shù)據(jù)安全確保數(shù)據(jù)不被無(wú)意泄露或損壞 保密防止對(duì)有關(guān)個(gè)人的信息進(jìn)行未授權(quán)的訪問(wèn) 保護(hù)確保網(wǎng)絡(luò)應(yīng)用程序不能濫用系統(tǒng)資源 對(duì)那些執(zhí)行高強(qiáng)度計(jì)算或處理大量數(shù)據(jù)的服務(wù)器,如果并發(fā)地處理請(qǐng)求,其運(yùn)行會(huì)更有效。這種特權(quán)和并發(fā)操作的結(jié)合使服務(wù)器的設(shè)計(jì)與實(shí)現(xiàn)較客戶機(jī)困難。 在設(shè)計(jì)客戶機(jī)應(yīng)用軟件時(shí),要包含這樣一些參數(shù),以便允許擁護(hù)全面指明目的機(jī)器以及目的協(xié)議端口號(hào)的參數(shù)。 全參數(shù)化在測(cè)試新的客戶機(jī)或服務(wù)器時(shí)特別有用,因?yàn)樗试S獨(dú)立于已在使用的現(xiàn)有軟件來(lái)進(jìn)行測(cè)試。例如,某個(gè)程序員可以構(gòu)建一個(gè)TELNET客戶機(jī)和服務(wù)器對(duì)(pair),使用非標(biāo)準(zhǔn)的協(xié)議端口調(diào)用它們,這樣不打擾標(biāo)準(zhǔn)服務(wù)就可對(duì)軟件進(jìn)行測(cè)試。在測(cè)試過(guò)程中,其他用戶可以繼續(xù)訪問(wèn)舊的TELNET服務(wù)而不受影響。2.4無(wú)連接的和面向無(wú)連接的服務(wù)器在程序員設(shè)計(jì)客戶機(jī)服務(wù)器軟件時(shí),他們必須在兩種類型的交互中做出選擇:無(wú)連接的風(fēng)格或面向連接的風(fēng)格。這兩種風(fēng)格的交互直接對(duì)應(yīng)與TCP/IP協(xié)議族所提供的兩個(gè)主要的運(yùn)輸協(xié)議。如果客戶機(jī)和服務(wù)器使用UDP進(jìn)行通信,那么交互就是無(wú)連接的;如果使用TCP,則交互就是面向連接的。 從應(yīng)用程序員的角度看,無(wú)連接的交互和面向連接的交互之間的區(qū)別是非常重要的,因?yàn)檫@決定了下層系統(tǒng)所提供的可靠性等級(jí)。TCP提供了穿過(guò)一個(gè)互連網(wǎng)絡(luò)進(jìn)行通信所需要的全部的可靠性。它驗(yàn)證數(shù)據(jù)的到達(dá),對(duì)未到達(dá)的報(bào)文要自動(dòng)進(jìn)行重傳。它還計(jì)算數(shù)據(jù)上的校驗(yàn)和,以保證數(shù)據(jù)在傳輸過(guò)程中沒(méi)有損壞。它使用序列號(hào)以確保數(shù)據(jù)按序到達(dá)并自動(dòng)忽略重復(fù)的分組。它提供了流量控制以確保發(fā)送方發(fā)送數(shù)據(jù)的速度不要超過(guò)接受方的承受能力。最后,如果下層網(wǎng)絡(luò)因任何原因變得無(wú)法運(yùn)作,TCP將通知客戶機(jī)和服務(wù)器雙方。 與TCP相比,使用UDP的客戶機(jī)和服務(wù)器在可靠傳輸上沒(méi)有任何保證。某個(gè)客戶機(jī)發(fā)送一個(gè)請(qǐng)求,這個(gè)請(qǐng)求可能丟失、重復(fù)、延遲或者傳遞失序。類似地,服務(wù)器發(fā)回給客戶機(jī)的響應(yīng)也可能丟失、重復(fù)、延遲或交付失序??蛻魴C(jī)和(或)服務(wù)器應(yīng)用程序必須采取合適的行動(dòng)以檢查并更正這樣的差錯(cuò)。 UDP可能是不可信的,這是因?yàn)樗峁┑氖潜M最大努力交付(best effort delivery)。UDP并不引入差錯(cuò),它只是依靠下層的IP互連網(wǎng)絡(luò)來(lái)交付分組。而IP則要依賴于下層的硬件網(wǎng)絡(luò)和中間的一些網(wǎng)關(guān)。從程序員的角度看,使用UDP的后果是:如果下層的互連網(wǎng)絡(luò)工作得,UDP也就工作得好。例如,在一個(gè)本地環(huán)境下UDP工作得好,因?yàn)樵诒镜丨h(huán)境下,可靠性差錯(cuò)很少發(fā)生。差錯(cuò)往往在通信延伸到一個(gè)廣域互連網(wǎng)時(shí)才發(fā)生。 程序員有時(shí)會(huì)犯這樣的錯(cuò)誤,即選擇了無(wú)連接的運(yùn)輸。例如,UDP來(lái)構(gòu)建應(yīng)用程序,并僅僅在一個(gè)局域網(wǎng)下測(cè)試這個(gè)應(yīng)用程序。因?yàn)橐粋€(gè)局域網(wǎng)很少甚至從不遲延分組、丟失分組或者將它們交付失序,這樣,應(yīng)用軟件好像工作得很好。然而,如果同樣的軟件要穿過(guò)一個(gè)廣域互連網(wǎng)絡(luò)使用,就可能失敗或產(chǎn)生不正確的結(jié)果。 初學(xué)者以及大多數(shù)有經(jīng)驗(yàn)的專業(yè)人員喜歡使用面向連接風(fēng)格的交互。面向連接的協(xié)議使編程簡(jiǎn)單,把程序員從檢查和改正差錯(cuò)的責(zé)任中解脫出來(lái)。實(shí)際上,在個(gè)像UDP這樣的無(wú)連接的互連網(wǎng)報(bào)文協(xié)議中加入可靠性并非容易之舉,它要求具有相當(dāng)?shù)膮f(xié)議設(shè)計(jì)經(jīng)驗(yàn)。 應(yīng)用程序也經(jīng)常只使用UDP。如果:(1)應(yīng)用協(xié)議指明必須使用UDP(假定應(yīng)用協(xié)議已設(shè)計(jì)了處理可靠性和交付差錯(cuò)的內(nèi)容)。(2)應(yīng)用程序協(xié)議要依靠硬件進(jìn)行廣播或組播。(3)應(yīng)用協(xié)議不能容忍TCP虛電路的額外的計(jì)算開(kāi)銷或時(shí)延要求。我們可作如下的概括: 在設(shè)計(jì)客戶機(jī)-服務(wù)器應(yīng)用時(shí),強(qiáng)烈建議初學(xué)者使用TCP,因?yàn)門CP提供了可靠的、面向連接的通信。程序僅在以下情況使用UDP。如果應(yīng)用協(xié)議處理可靠性,或應(yīng)用協(xié)議不能容忍虛電路的額外開(kāi)銷。 2.5無(wú)狀態(tài)的和有狀態(tài)的服務(wù)器 由服務(wù)器維護(hù)的、關(guān)于它與客戶機(jī)正在進(jìn)行的交互的信息稱為狀態(tài)信息。不保持任何狀態(tài)信息的服務(wù)器稱作無(wú)狀態(tài)服務(wù)器(stateless server),而與此相反的稱為有狀態(tài)的服務(wù)器(stateful server)。 期望獲得高效率促使設(shè)計(jì)者在服務(wù)器中保存狀態(tài)信息。在服務(wù)器中保持少量信息可減少客戶機(jī)和服務(wù)器間交換的報(bào)文的大小,還能允許服務(wù)器快速地響應(yīng)請(qǐng)求。從本質(zhì)上說(shuō),狀態(tài)信息允許服務(wù)器記住客戶機(jī)以前申請(qǐng)了什么,并在每個(gè)新的請(qǐng)求到來(lái)時(shí),計(jì)算出一個(gè)增加的響應(yīng)。相反,采用無(wú)狀態(tài)服務(wù)器的動(dòng)機(jī)是協(xié)議的可靠性:如果報(bào)文丟失、重復(fù)或交付失序或者如果客戶機(jī)計(jì)算機(jī)崩潰或重啟動(dòng),則一個(gè)服務(wù)器中的狀態(tài)信息就會(huì)變得不正確。在服務(wù)器計(jì)算響應(yīng)時(shí),若使用了不正確的狀態(tài)信息,可能產(chǎn)生不正確的響應(yīng)。 一個(gè)有狀態(tài)的服務(wù)器的例子: 考慮一個(gè)文件服務(wù)器,它允許客戶機(jī)遠(yuǎn)程訪問(wèn)保存在本地磁盤中的信息。服務(wù)器作為一個(gè)應(yīng)用程序運(yùn)作,它等待在網(wǎng)絡(luò)上的某個(gè)客戶機(jī)與它聯(lián)系??蛻魴C(jī)發(fā)送以下兩種請(qǐng)求之一,它要么發(fā)送一個(gè)從某個(gè)指定文件中獲取數(shù)據(jù)的請(qǐng)求或者發(fā)送一個(gè)在指定文件中存儲(chǔ)數(shù)據(jù)的請(qǐng)求。服務(wù)器執(zhí)行所請(qǐng)求的操作并向客戶機(jī)發(fā)回響應(yīng)。 一方面,如果文件服務(wù)器是無(wú)狀態(tài)的,它是不維護(hù)事物所處理的信息。從客戶機(jī)發(fā)來(lái)的每個(gè)報(bào)文(請(qǐng)求服務(wù)器從某個(gè)文件獲取數(shù)據(jù)),都必須指明文件全名(名字可能相當(dāng)長(zhǎng))、想要獲取的數(shù)據(jù)在文件內(nèi)的位置、以及想要獲取的字節(jié)數(shù)。類似地,每個(gè)要求服務(wù)器在某個(gè)文件中存儲(chǔ)數(shù)據(jù)的請(qǐng)求也必須指明文件全名、數(shù)據(jù)將存儲(chǔ)在文件中的位置、以及想要存儲(chǔ)的數(shù)據(jù)。 另一方面,如果服務(wù)器為它的客戶機(jī)維護(hù)了狀態(tài)信息,它就不必在每個(gè)報(bào)文中都傳遞文件名。服務(wù)器維護(hù)著一張表,該表保持著關(guān)于當(dāng)前正被訪問(wèn)的文件的狀態(tài)信息。 在理想的情況下,只要網(wǎng)絡(luò)能可靠地交付所有的報(bào)文,并且計(jì)算機(jī)從不崩潰,則在這種情況下,使服務(wù)器為每個(gè)進(jìn)行著的交互保持少量狀態(tài)信息,就可以使交互的報(bào)文小些,并且處理也簡(jiǎn)單些。 一般來(lái)說(shuō),對(duì)保持正確的狀態(tài)信息這個(gè)問(wèn)題只有用復(fù)雜的協(xié)議才能解決,這種協(xié)議解決不可靠的交付和計(jì)算機(jī)系統(tǒng)重啟動(dòng)的問(wèn)題。概括地說(shuō): 在真實(shí)的互連網(wǎng)中,機(jī)器可能崩潰或重啟動(dòng),而報(bào)文可能丟失、重復(fù)、或交付失序。采用有狀態(tài)的設(shè)計(jì)會(huì)導(dǎo)致復(fù)雜的應(yīng)用協(xié)議,而這種應(yīng)用協(xié)議難于設(shè)計(jì)、理解和正確編程。 一個(gè)服務(wù)器到底是無(wú)狀態(tài)還是有狀態(tài)的呢?這一問(wèn)題更多地集中在應(yīng)用協(xié)議上,而不是在實(shí)現(xiàn)上。如果應(yīng)用協(xié)議指明某個(gè)特定報(bào)文的意義在某種方式上依賴于先前的一些報(bào)文,這樣就不可能提供一種無(wú)狀態(tài)的交互。 從本質(zhì)上說(shuō),無(wú)狀態(tài)的問(wèn)題關(guān)注于應(yīng)用協(xié)議是否承擔(dān)可靠交付的責(zé)任。要避免出問(wèn)題并使交付可靠,應(yīng)用協(xié)議的設(shè)計(jì)者必須確保每個(gè)報(bào)文決無(wú)二義性,也就是說(shuō),一個(gè)報(bào)文既不能依賴于被按序交付,也不能依賴于前一個(gè)報(bào)文已被交付,關(guān)鍵是協(xié)議設(shè)計(jì)者必須這樣構(gòu)建交互,即無(wú)論一個(gè)請(qǐng)求何時(shí)到達(dá)或多次到達(dá),服務(wù)器都應(yīng)給出相同的響應(yīng),數(shù)學(xué)家們用術(shù)語(yǔ)冪等(idempotent)指一個(gè)總是產(chǎn)生相同結(jié)果的數(shù)學(xué)運(yùn)算。我們用這個(gè)術(shù)語(yǔ)制這種協(xié)議,它讓服務(wù)器對(duì)某個(gè)給定報(bào)文發(fā)出相同的響應(yīng),而不管該報(bào)文到達(dá)幾次。 如果一個(gè)互連網(wǎng)中的下層網(wǎng)絡(luò)可能使報(bào)文重復(fù)、延遲或不按序交付,或者運(yùn)行客戶機(jī)應(yīng)用程序的計(jì)算機(jī)可能會(huì)意外崩潰,那么對(duì)這樣的網(wǎng)絡(luò),服務(wù)器應(yīng)是無(wú)狀態(tài)的,只有應(yīng)用協(xié)議設(shè)計(jì)成讓操作是冪等的,服務(wù)器才是無(wú)狀態(tài)的。第三章 網(wǎng)絡(luò)通信程序的編寫從技術(shù)上講,服務(wù)器是一個(gè)程序而不是一塊硬件。然而計(jì)算機(jī)用戶經(jīng)常(錯(cuò)誤地)將這一術(shù)語(yǔ)用于指負(fù)責(zé)運(yùn)行某個(gè)特定的服務(wù)器程序的計(jì)算機(jī)。例如,他們可能說(shuō):“那臺(tái)計(jì)算機(jī)是我們的文件服務(wù)器”,這時(shí)他們實(shí)際上指的是:“那臺(tái)計(jì)算機(jī)運(yùn)行我們的文件服務(wù)器程序”。3.1客戶機(jī)和服務(wù)器 許多程序并不準(zhǔn)確符合客戶機(jī)或服務(wù)器的定義,一個(gè)服務(wù)器程序也許需要訪問(wèn)網(wǎng)絡(luò)服務(wù),而這個(gè)服務(wù)要求該程序作為一個(gè)客戶機(jī)。例如,假設(shè)我們的文件服務(wù)器程序需要獲得本日的時(shí)間,以便在文件中打上訪問(wèn)時(shí)間的標(biāo)記。我們還假設(shè)運(yùn)行服務(wù)器的系統(tǒng)沒(méi)有日期時(shí)間,為了獲得這個(gè)時(shí)間,該服務(wù)器就作為客戶機(jī)向日期時(shí)鐘服務(wù)器發(fā)出請(qǐng)求。 在一個(gè)具有許多服務(wù)器的網(wǎng)絡(luò)環(huán)境中,經(jīng)??梢园l(fā)現(xiàn)某一個(gè)應(yīng)用的服務(wù)器對(duì)另一個(gè)應(yīng)用則是客戶機(jī),當(dāng)然,設(shè)計(jì)人員必須小心從事以避免在這些服務(wù)器之間出現(xiàn)循環(huán)的依賴關(guān)系。因此: 客戶機(jī)服務(wù)器范例將進(jìn)行通信的應(yīng)用程序分為兩類即:要么是客戶機(jī)要么是服務(wù)器,這取決于它是否發(fā)起通信。除了為標(biāo)準(zhǔn)應(yīng)用設(shè)計(jì)的客戶機(jī)和服務(wù)器軟件外,許多TCP/IP用戶為其自定義的非標(biāo)準(zhǔn)的應(yīng)用構(gòu)建了客戶機(jī)和服務(wù)器軟件。 初學(xué)者以及多數(shù)有經(jīng)驗(yàn)的程序員使用TCP在客戶機(jī)與服務(wù)器之間運(yùn)輸報(bào)文,因?yàn)門CP提供了互連網(wǎng)絡(luò)環(huán)境所需要的可靠性。程序員只有在TCP不能解決問(wèn)題時(shí)才選擇UDP。 在服務(wù)器中保持狀態(tài)信息可以提高效率。然而,如果客戶機(jī)意外崩潰或者下層的傳輸網(wǎng)絡(luò)允許重復(fù)、延遲或分組丟失則狀態(tài)信息會(huì)消耗資源或者變得不正確。因此,多數(shù)應(yīng)用協(xié)議設(shè)計(jì)者努力減少狀態(tài)信息。如果應(yīng)用協(xié)議不能使操作成為冪等的,就可能不能使用無(wú)狀態(tài)的服務(wù)器。 各種程序不能簡(jiǎn)單地劃分為客戶機(jī)和服務(wù)器這兩類,這是因?yàn)樵S多程序同時(shí)具有客戶機(jī)和服務(wù)器這兩種功能。一個(gè)程序?qū)δ硞€(gè)服務(wù)來(lái)說(shuō)是服務(wù)器,但它又可作為客戶機(jī)訪問(wèn)其他的服務(wù)。 3.2客戶機(jī)和服務(wù)器的實(shí)現(xiàn)在應(yīng)用層,客戶-服務(wù)器(Client/Server)是典型的Web信息系統(tǒng)模式??蛻?服務(wù)器一詞在20世紀(jì)80年代首先被提出,起初,主要指?jìng)€(gè)人計(jì)算機(jī)和Web的連接,在互聯(lián)網(wǎng)中,主要指計(jì)算機(jī)系統(tǒng)之間通過(guò)Web的信息交互傳遞模式;客戶是指信息服務(wù)的索取方,服務(wù)器指服務(wù)的提供方,根據(jù)軟件的不同設(shè)置,一臺(tái)計(jì)算機(jī)可以是客戶也可以是服務(wù)器。隨著Web科技的發(fā)展,客戶-服務(wù)器軟件框架成為一種靈活、分布式和模塊化的信息系統(tǒng)結(jié)構(gòu)。與客戶-服務(wù)器軟件框架相反的結(jié)構(gòu)是大型集中式主機(jī)。這種結(jié)構(gòu)將主要運(yùn)算操作放在中心計(jì)算機(jī)上。同集中式大型計(jì)算系統(tǒng)比較,客戶-服務(wù)器結(jié)構(gòu)的主要優(yōu)點(diǎn)是提供了良好的實(shí)用性、靈活性、交互性和可擴(kuò)展性??蛻?服務(wù)器以數(shù)據(jù)庫(kù)服務(wù)器取代集中式文件共享進(jìn)而實(shí)現(xiàn)了計(jì)算機(jī)系統(tǒng)之間的松耦合。 由于客戶并非完全依靠服務(wù)器,計(jì)算機(jī)之間可以更動(dòng)態(tài)地進(jìn)行協(xié)作。這樣擴(kuò)大了計(jì)算機(jī)聯(lián)網(wǎng)的范圍,同時(shí)降低了Web流量??蛻艉头?wù)器之間在企業(yè)內(nèi)部網(wǎng)(Intranet)中主要通過(guò)遠(yuǎn)程過(guò)程調(diào)用(remote procedure call)和SQL數(shù)據(jù)庫(kù)檢索語(yǔ)言,在因特網(wǎng)(Internet)上可以通過(guò)HTTP、telnet、FTP等協(xié)議進(jìn)行通信。Web程序客戶-服務(wù)器模式衍生出了不同體系結(jié)構(gòu),如雙層結(jié)構(gòu)、三層結(jié)構(gòu)和分布式結(jié)構(gòu)等。它們適用于不同的情況。雙層結(jié)構(gòu)(2-tier architecture),通常將客戶端程序作為界面,而將數(shù)據(jù)庫(kù)置于服務(wù)器上;一臺(tái)服務(wù)器上的數(shù)據(jù)庫(kù)同時(shí)支持多個(gè)用戶(一般是個(gè)人計(jì)算機(jī)),數(shù)據(jù)處理過(guò)程由客戶界面和數(shù)據(jù)庫(kù)管理系統(tǒng)(database management systems)協(xié)調(diào)進(jìn)行,數(shù)據(jù)庫(kù)管理系統(tǒng)(如Oracle,DB2,MySQL等)提供現(xiàn)成的方法供用戶調(diào)用,用戶也可以在其基礎(chǔ)之上進(jìn)行開(kāi)發(fā);雙層結(jié)構(gòu)的Web系統(tǒng)適用于少量用戶在局域網(wǎng)內(nèi)對(duì)數(shù)據(jù)進(jìn)行操作,但是當(dāng)客戶數(shù)量超過(guò)數(shù)百時(shí),由于雙層結(jié)構(gòu)系統(tǒng)和大量的客戶保持聯(lián)系,處理速度往往難以滿足要求,另外,由于雙層結(jié)構(gòu)系統(tǒng)對(duì)數(shù)據(jù)庫(kù)的依賴性很強(qiáng),系統(tǒng)的維護(hù)和更新常常令人頭疼,當(dāng)服務(wù)器的機(jī)器升級(jí)或更新時(shí),軟件系統(tǒng)的重新安裝和調(diào)試非常麻煩。 三層結(jié)構(gòu)(3-tier architecture)彌補(bǔ)了雙層結(jié)構(gòu)的不足;在客戶界面和數(shù)據(jù)庫(kù)之間加入了完善系統(tǒng)功能的中間層(middle tier),典型的中間層可以是事務(wù)處理控制器(transaction processing monitor)、消息服務(wù)器(message server)、應(yīng)用服務(wù)器(application server)等;在客戶界面與數(shù)據(jù)庫(kù)之間,中間層支持?jǐn)?shù)據(jù)檢索、程序的分布式運(yùn)行和數(shù)據(jù)庫(kù)狀態(tài)控制,中間層像是數(shù)據(jù)的周轉(zhuǎn)和分配站,客戶界面不再直接獲取數(shù)據(jù),而是通過(guò)中間層提供的接口間接訪問(wèn)和更新數(shù)據(jù),中間層可以協(xié)調(diào)和優(yōu)化各種處理進(jìn)程,這樣,對(duì)于大量客戶使用的系統(tǒng),三層結(jié)構(gòu)的主要特點(diǎn)是能提高用戶的使用效率,同時(shí)提高程序的可移植性;由于中間層使用標(biāo)準(zhǔn)化的接口,使Web程序無(wú)需改動(dòng)就能在不同機(jī)器上運(yùn)行,由于三層結(jié)構(gòu)系統(tǒng)比雙層結(jié)構(gòu)復(fù)雜,程序開(kāi)發(fā)人員需要掌握和考慮多種技術(shù)因素,例如如何維護(hù)數(shù)據(jù)交換一致,如何保證安全等。3.3客戶機(jī)-服務(wù)器范例的應(yīng)用客戶機(jī)-服務(wù)器范例用發(fā)起通信的方向來(lái)對(duì)程序分類,即區(qū)別一個(gè)程序是客戶機(jī)還是服務(wù)器。一般地講,發(fā)起對(duì)等通信的應(yīng)用程序叫客戶機(jī)。端用戶往往在其使用網(wǎng)絡(luò)服務(wù)時(shí)調(diào)用客戶機(jī)軟件。多數(shù)客戶機(jī)軟件由常規(guī)的應(yīng)用程序構(gòu)成??蛻魴C(jī)應(yīng)用程序每次執(zhí)行都要向服務(wù)器進(jìn)行聯(lián)系、發(fā)送申請(qǐng)已經(jīng)等待響應(yīng)。當(dāng)響應(yīng)到達(dá)時(shí),客戶機(jī)再繼續(xù)處理。客戶機(jī)常常較服務(wù)器易于構(gòu)建,它的運(yùn)行往往并不需要特殊的系統(tǒng)特權(quán)。 比較而言,服務(wù)器是等待來(lái)自客戶機(jī)的入呼叫通信請(qǐng)求的任何一種程序。服務(wù)器接收某個(gè)客戶機(jī)的請(qǐng)求,執(zhí)行所需的計(jì)算然后將結(jié)果返回給客戶機(jī)。3.4 Application 同 Applet 的通信兩端通過(guò)Socket機(jī)制進(jìn)行連接:1. 客戶端的編程流程:(1) 打開(kāi)Socket,新建一個(gè)套接字;(2) 為套接字建立一個(gè)輸入和輸出流;(3) 根據(jù)服務(wù)器協(xié)議從套接字讀入或向套接字寫入;(4) 清除套接字和輸入/輸出流;2) 服務(wù)器端的編程流程:(1) 打開(kāi)Server Socket,創(chuàng)建一個(gè)服務(wù)器型套接字和一個(gè)普通套接字,服務(wù)器型套接字在指定端口為客戶端請(qǐng)求的Socket 服務(wù);(2) 使用ServerSocket類的accept()方法使服務(wù)器型套接字處于監(jiān)聽(tīng)狀態(tài)并把監(jiān)聽(tīng)結(jié)果返回給普通套接字;(3) 為該普通套接字創(chuàng)建輸入和輸出流;(4) 從輸入和輸出流中讀入或?qū)懭胱止?jié)流,進(jìn)行相應(yīng)的處理,并將結(jié)果返回給客戶端;(5) 在客戶端和服務(wù)器工作結(jié)束后關(guān)閉所有的對(duì)象,如服務(wù)器型的套接字,普通套接字,輸入和輸出流。正是由于Java系統(tǒng)具有基于Socket的靈活通信機(jī)制,因而其應(yīng)用程序能自由地打開(kāi)和訪問(wèn)網(wǎng)絡(luò)上的對(duì)象,就象在本地文件系統(tǒng)中一樣。3.5 Applet之間的通信Applet之間的通信使用Applet Context類的getApplet()方法。只要在程序中加入 Applet oneapplet=getAppletContext().getApplet(“first”);便可使用name為first的Applet中的方法了。在該課題中大量使用了該種通信方法,因?yàn)閷iT同服務(wù)器端通信的 Applet中包含接收信息方法和發(fā)送信息方法,所有客戶端的負(fù)Applet都要使用責(zé)通信的Applet中的方法,所以客戶端的Applet同負(fù)責(zé)通信的Applet必須進(jìn)行通信。3.6 程序/服務(wù)器端程序S.java 負(fù)責(zé)與客戶端通信import java.io.*;import .*;import java.lang.*;import T2;class ThreadEchoHandler extends Thread /創(chuàng)建線程T2 theT2=new T2();Socket incoming;int counter;ThreadEchoHandler(Socket i,int c) incoming=i;counter=c; public void run()tryDataInputStream in=new DataInputStream(incoming.getInputStream();DataOutputStream out=new DataOutputStream(incoming.getOutputStream();System.out.println (hello); boolean done=false;while(!done)String aa= ;String str=in.readUTF(); /從客戶端得到字符串/在此加入各自的服務(wù)程序System.out.println (str);theT2.pass(str); /解碼theT2.tongji( ); /修改監(jiān)控庫(kù)中的信息aa=theT2.guan( );/操縱數(shù)據(jù)庫(kù)System.out.println (string z is:+aa);if(pareTo(null)!=0 ) /若是查詢數(shù)據(jù)庫(kù),返回查詢后的結(jié)果/若不是查詢數(shù)據(jù)庫(kù),不向客戶端輸出信息 out.writeUTF(aa);out.flush( ); /while incoming.close( ); /線程關(guān)閉/trycatch(IOException e)System.out.println(e);/end run/-class S public static void main(String args) int i=1;tryServerSocket s=new ServerSocket(1111);for(; ;)Socket incoming=s.accept( );System.out.println(connect: +i);new ThreadEchoHandler(incoming,i).start( );i+;catch(Exception e) System.out.println(e); /客戶端通信小應(yīng)用程序 Echo.javaimport java.io.*;import .*;import java.awt.*;import java.applet.*;public class Echo extends AppletTextArea ta;Socket echoSocket;DataOutputStream os;DataInputStream is;String Line;public void init( ) setBackground(Color.white);ta=new TextArea(5,80);ta.setEditable(false);add(ta); tryechoSocket=new Socket(1,1111); /與服務(wù)器建立連接catch(IOException e)System.out.println(error);public void st(String stri) /發(fā)送字符串的方法try DataOutputStream os=new DataOutputStream(echoSocket.getOutputStream();DataInputStream is=new DataInputStream(echoSocket.getInputStream(); os.writeUTF(+ stri ); /向服務(wù)器輸送stringos.flush();catch(IOException e)System.out.println( error:+e); public String st1() /接收字符串的方法String Line=;try DataOutputStream os=new DataOutputStream(echoSocket.getOutputStream();DataInputStream is=new DataInputStream(echoSocket.getInputStream(); Line=is.readUTF(); /從服務(wù)器讀來(lái)的信息ta.appendText(+Line); /在文本域中輸出信息catch(IOException e)System.out.println( error:+e); return Line;所謂socket通常也稱作套接字,用于描述IP地址和端口,是一個(gè)通信鏈的句柄。應(yīng)用程序通常通過(guò)套接字向網(wǎng)絡(luò)發(fā)出請(qǐng)求或者應(yīng)答網(wǎng)絡(luò)請(qǐng)求。 Socket和ServerSocket類庫(kù)位于包中。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ō),套接字是平等的,并沒(méi)有差別,不因?yàn)樵诜?wù)器端或在客戶端而產(chǎn)生不同級(jí)別。不管是Socket還是ServerSocket它們的工作都是通過(guò)SocketImpl類及其子類完成的。 下面給出一個(gè)最簡(jiǎn)單的Socket通信的例子供初學(xué)者參考: 服務(wù)器端:ServerDemo.java Java代碼package com.lanber.socket;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import .ServerSocket;import .Socket;public class ServerDemo /* * 注意:Socket的發(fā)送與接收是需要同步進(jìn)行的,即客戶端發(fā)送一條信息,服務(wù)器必需先接收這條信息, * 而后才可以向客戶端發(fā)送信息,否則將會(huì)有運(yùn)行時(shí)出錯(cuò)。 * param args */ public static void m
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2013年全國(guó)高中數(shù)學(xué)聯(lián)賽試題及解答
- 員工敬業(yè)保密合同協(xié)議
- 正規(guī)授權(quán)工廠合同協(xié)議
- 正規(guī)農(nóng)田出租合同協(xié)議
- 模塊回收銷售合同協(xié)議
- 品牌服裝加盟合同協(xié)議
- 橡膠合同規(guī)格補(bǔ)充協(xié)議
- 和周邊商鋪合作合同協(xié)議
- 商品房二套房合同協(xié)議
- 員工勞務(wù)派遣協(xié)議書范本
- 人教版小學(xué)二年級(jí)數(shù)學(xué)下冊(cè) 第6單元 練習(xí)十五 課件
- 北京2025年市場(chǎng)監(jiān)管總局直屬單位第一批招聘210人筆試歷年參考題庫(kù)附帶答案詳解
- 【+初中語(yǔ)文++】第23課蛟龍?zhí)胶Un件+統(tǒng)編版語(yǔ)文七年級(jí)下冊(cè)
- 八年級(jí)勞動(dòng)教育測(cè)試題目及答案
- 球團(tuán)焙燒工(高級(jí))技能鑒定備考試題庫(kù)-上(單選、多選題)
- 知識(shí)寶庫(kù)中的寶藏知識(shí)產(chǎn)權(quán)的投資潛力和實(shí)踐路徑探索
- 基于深度學(xué)習(xí)的圖像修復(fù)算法研究
- 隱私與保密信息管理制度
- DB32-T 2355-2022 綜合交通建設(shè)試驗(yàn)檢測(cè)用表編制規(guī)范(修)
- 八年級(jí)體育教案(全冊(cè))
- 2022新高考卷小說(shuō)《江上》 答案+評(píng)點(diǎn)
評(píng)論
0/150
提交評(píng)論