![(精品論文)畢業(yè)論文使用java編寫網(wǎng)絡通信程序_第1頁](http://file.renrendoc.com/FileRoot1/2019-7/14/fda1afeb-2009-4b5d-8fde-4cda9266b126/fda1afeb-2009-4b5d-8fde-4cda9266b1261.gif)
![(精品論文)畢業(yè)論文使用java編寫網(wǎng)絡通信程序_第2頁](http://file.renrendoc.com/FileRoot1/2019-7/14/fda1afeb-2009-4b5d-8fde-4cda9266b126/fda1afeb-2009-4b5d-8fde-4cda9266b1262.gif)
![(精品論文)畢業(yè)論文使用java編寫網(wǎng)絡通信程序_第3頁](http://file.renrendoc.com/FileRoot1/2019-7/14/fda1afeb-2009-4b5d-8fde-4cda9266b126/fda1afeb-2009-4b5d-8fde-4cda9266b1263.gif)
![(精品論文)畢業(yè)論文使用java編寫網(wǎng)絡通信程序_第4頁](http://file.renrendoc.com/FileRoot1/2019-7/14/fda1afeb-2009-4b5d-8fde-4cda9266b126/fda1afeb-2009-4b5d-8fde-4cda9266b1264.gif)
![(精品論文)畢業(yè)論文使用java編寫網(wǎng)絡通信程序_第5頁](http://file.renrendoc.com/FileRoot1/2019-7/14/fda1afeb-2009-4b5d-8fde-4cda9266b126/fda1afeb-2009-4b5d-8fde-4cda9266b1265.gif)
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
目錄摘要2前言4第1章 JAVA概述51.1 JAVA 簡介51.2 Java的特性61.2.1 Java中輸入/輸出流概念61.2.2 Socket 機制61.2.3 Java語言71.2.4 JAVA工具8第2章 如何使用JAVA來進行網(wǎng)絡編程102.1使用JAVA來進行網(wǎng)絡編程102.2客戶機/服務器通信的動機102.3服務器的特權和復雜性112.4無連接的和面向無連接的服務器112.5無狀態(tài)的和有狀態(tài)的服務器12第3章 網(wǎng)絡通信程序的編寫143.1客戶機和服務器143.2客戶機/服務器通信的實現(xiàn)143.3客戶機-服務器范例的應用163.4 Application 同 Applet 的通信163.5 Applet之間的通信163.6程序17第4章 程序調(diào)試25后記26參考文獻27湖北廣播電視大學摘 要Java是當前最流行的程序設計語言之一,它的出現(xiàn)大大地促進了軟件產(chǎn)業(yè)和互聯(lián)網(wǎng)的發(fā)展。Java之所以如此地流行是因為它是一種簡單易學易用的、純面向?qū)ο蟮?、可移植的、安全的、高效的、健壯的、分布式的、多線程的、結構中立的、可解釋執(zhí)行的動態(tài)語言。Java擁有包括Sun、IBM在內(nèi)的世界各大軟件廠商的支持,因而發(fā)展迅速。隨著計算機技術的發(fā)展,網(wǎng)絡通信顯得越來越重要.計算機技術越成熟,對通信的要求越高,本論文主要闡述了使用JAVA編程語言對基于客戶/服務器模式的應用編寫網(wǎng)絡通信程序以及介紹了Application 同 Applet 的通信和Applet之間的通信,討論了SOCKET機制、Java中輸入輸出流以及程序?qū)崿F(xiàn)代碼。關鍵詞:JAVA,網(wǎng)絡,SOCKET,客戶/服務器,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上最流行的編程語言,其發(fā)展非常迅速。從1995年誕生以來,經(jīng)過短短的幾年發(fā)展,如今它已不僅僅是一門語言,而已發(fā)展為一門技術,包括Java的芯片技術、Java的編譯技術、Java的數(shù)據(jù)庫連接技術、基于Java的信息家電的聯(lián)網(wǎng)技術、企業(yè)信息服務的綜合求解方案技術等等。Java語言作為一種優(yōu)秀的面向?qū)ο蟮某绦蛟O計語言,具有平臺無關性、安全機制、高可靠性和內(nèi)嵌的網(wǎng)絡支持等特點。由于Java語言的這些特點,使得Java語言成為當前網(wǎng)絡應用程序編寫的首選工具之一。還有人預言,不久的將來,全世界90%的程序代碼將用Java語言重寫和改寫。Java語言和技術的大量使用也促使Java語言本身不斷發(fā)展。本論文是面向高職??茖W生及其他對Java語言和面向?qū)ο缶幊碳夹g感興趣的讀者的。學習本論文前應對計算機有一定的認識,最好了解DOS、Windows等系統(tǒng)的基礎操作。可以將本書作為第一門開發(fā)語言來學習,獲得開發(fā)程序的初步經(jīng)驗。對有其他高級語言編程經(jīng)驗的讀者,學習本文也會感到得心應手,從中領略Java語言面向?qū)ο?、易學易用的特點。本文第介紹了面向?qū)ο蟮囊恍┗靖拍?,引出兩種Java程序的介紹,并簡述了Java程序的結構和開發(fā)過程。介紹Java語言編程的基礎知識,包括一般程序設計語言的大部分內(nèi)容,有基本數(shù)據(jù)類型、常量、變量、運算符、表達式和流程控制語句、方法(函數(shù))等,還介紹了如何使用Java語言初步編寫網(wǎng)絡通信程序。計算機語言的學習應是課堂學習和上機實驗的有機結合,特別要重視上機實驗的環(huán)節(jié)。優(yōu)秀的軟件開發(fā)人員都有大量上機編程的經(jīng)驗,從實踐中可學到很多文中沒有的東西。第一章 JAVA概述1.1 JAVA 簡介 Java是由Sun Microsystems 公司于1995年5月推出的Java程序設計語言所發(fā)展出來的程序語言(以下簡稱Java語言或JAVA),它本身是一種對象導向(Object-Oriented )的程序語言。JAVA目前在手機上且應用最多的就是手機Java游戲。Java也號稱是能跨平臺使用的語言,這主要是因為Java本身被編譯之后,并不是直接產(chǎn)生可執(zhí)行的碼,而是產(chǎn)生一種中間碼叫作 ByteCode,這種碼必需在透過 Java 的直譯器來解讀它,才能夠真正的被執(zhí)行,所以只要平臺上裝有這種Java的直譯器,就能解讀 ByteCode 也就能執(zhí)行 Java 編譯過的程序,故與Java程序是在那種平臺上被編譯的,就完全沒有干系了。Java 寫出來的程序可分為兩類,分別是Java Applet 與一般的Application,而Application 這一類就與一般的程序如C+ 的作用是比較類似的,是一個獨立可執(zhí)行的應用程序,像HotJava是一個瀏覽器,且就是使用Java 程序所發(fā)展出來的。最常見的Java程序包括應用程序和Applets。應用程序是單獨的程序,諸如HotJava 瀏覽器軟件就是用Java語言編寫的。 Applets 類似于應用程序,但是它們不能單獨運行,Applets可以在支持Java的瀏覽器中運行。Applet主要是內(nèi)置于HTML網(wǎng)頁中,在瀏覽時發(fā)揮作用。Java的目標是為了滿足在一個充滿各式各樣不同種機器,不同操作系統(tǒng)平臺的網(wǎng)絡環(huán)境中開發(fā)軟件。利用Java程序語言,可以在網(wǎng)頁中加入各式各樣的動態(tài)效果。可以放上一段動畫,加入聲音,也可以建立交互式網(wǎng)頁等。Java手機軟件平臺,Java手機軟件平臺采用的基本Java平臺是CLDC (Connected Limited Device Configuration)和MIDP (Mobile Information Device Profile),是J2ME (Java 2 Micro Edition)的一部分,在中國一般稱為“無線Java”技術。此前,有人把它叫做“K-Java”;其實,K-Java的叫法只是Sun公司在開發(fā)KVM Java虛擬機時的項目代號,在該技術被正式命名為KVM后,就不再用K-Java了。KJava即J2ME(Java 2 Micro Edition),是Sun公司專門用于嵌入式設備的Java軟件。以KJava編程語言為手機開發(fā)應用程序,可以為手機用戶提供游戲、個人信息處理、電子地圖、股票等服務程序。J2ME (Java 2 Micro Edition)是致力于消費產(chǎn)品和嵌入式設備的最佳解決方案。J2ME在設計其規(guī)格的時候,遵循著“對于各種不同的裝置而造出一個單一的開發(fā)系統(tǒng)是沒有意義的事”這個基本原則。于是J2ME先將所有的嵌入式裝置大體上區(qū)分為兩種:一種是運算功能有限、電力供應也有限的嵌入式裝置(比方說PDA、手機);另外一種是運算能力相對較佳、并且在電力供應上相對比較充足的嵌入式裝置(比方說冷氣機、電冰箱)。因為這兩種區(qū)分,所以Java引入了一個叫做Configuration的概念,然后把上述運算功能有限、電力有限的嵌入式裝置定義在Connected Limited Device Configuration(CLDC)規(guī)格之中;而另外一種裝置則規(guī)范為Connected Device Configuration(CDC)規(guī)格。也就是說,J2ME先把所有的嵌入式裝置利用Configuration的概念區(qū)隔成兩種抽象的型態(tài)。1.2 Java的特性 Java技術的開放性、安全性和龐大的社會已有資源,以及其跨平臺性,即“編寫一次,到處運行”的特點,使Java技術成為智能手機軟件平臺的事實標準。采用Java技術后,編寫應用程序和提供服務的人就不必關心接受其服務的手機采用的是什么操作系統(tǒng)和芯片,只要按照Java的要求去寫程序就好了;同樣,生產(chǎn)手機的廠商也不必顧慮將來誰來提供增值服務??梢钥闯?,采用Java技術,可以建立完整、高效的無線數(shù)據(jù)增值服務產(chǎn)業(yè)鏈,從而為用戶提供靈活、個性化、內(nèi)容方式多樣的服務。1.2.1 Java中輸入/輸出流概念過濾流DataInputStream 和DataOutputStream 除了分別作為FilterInputStream 和FilterOutputStream的子類外,還分別實現(xiàn)了接口DataInput 和DataOutput。接口DataInput 中定義的方法主要包括從流中讀取基本類型的數(shù)據(jù)、讀取一行數(shù)據(jù)、或者讀取指定長度的字節(jié)數(shù),如readBoolean() readInt()、readLine()、readFully()等。接口DataOutput中定義的方法主要是向流中寫入基本類型的數(shù)據(jù)或者寫入一定長度的字節(jié)數(shù)組,如writeChar()、writeDouble() DataInputStream可以從所連接的輸入流中讀取與機器無關的基本類型數(shù)據(jù),用以實現(xiàn)一種獨立于具體平臺的輸入方式;DataInputStream 可以向所連接的輸出流寫入基本類型的數(shù)據(jù)。1.2.2 Socket 機制Socket是面向客戶/服務器模型設計的,網(wǎng)絡上的兩個程序通過一個雙向的通訊連接實現(xiàn)數(shù)據(jù)的交換,這個雙向鏈路的一端稱為一個Socket。 Socket通常用來實現(xiàn)客戶方和服務方的連接??蛻舫绦蚩梢韵騍ocket寫請求,服務器將處理此請求,然后通過Socket將結果返回給用戶。Socket通信機制提供了兩種通訊方式:有聯(lián)接和無聯(lián)接方式,分別面向不同的應用需求。使用有聯(lián)接方式時,通信鏈路提供了可靠的,全雙工的字節(jié)流服務。在該方式下,通信雙方必須創(chuàng)建一個聯(lián)接過程并建立一條通訊鏈路,以后的網(wǎng)絡通信操作完全在這一對進程之間進行,通信完畢關閉此聯(lián)接過程。使用無聯(lián)接方式時其系統(tǒng)開銷比無聯(lián)接方式小,但通信鏈路提供了不可靠的數(shù)據(jù)報服務,不能保證信源所傳輸?shù)臄?shù)據(jù)一定能夠到達信宿。在該方式下,通信雙方不必創(chuàng)建一個聯(lián)接過程和建立一條通訊鏈路,網(wǎng)絡通信操作在不同的主機和進程之間轉發(fā)進行。1.2.3 Java語言Java語言的優(yōu)點主要表現(xiàn)在:簡單、面向?qū)ο蟆⒍嗑€程、分布性、體系結構中立、安全性等方面。(1) 簡單性Java與C+語言非常相近,但Java比C+簡單,它拋棄了C+中的一些不是絕對必要的功能,如頭文件、預處理文件、指針、結構、運算符重載、多重繼承以及自動強迫同型。 Java實現(xiàn)了自動的垃圾收集,簡化了內(nèi)存管理的工作。這使程序設計更加簡便,同時減少了出錯的可能。(2) 面向?qū)ο驤ava提供了簡單的類機制和動態(tài)的構架模型。對象中封裝了它的狀態(tài)變量和方法,很好地實現(xiàn)了模塊化和信息隱藏;而類則提供了一類對象的原型,通過繼承和重載機制,子類可以使用或重新定義父類或超類所提供的方法,從而既實現(xiàn)了代碼的復用,又提供了一種動態(tài)的解決方案。Java是一種完全面向?qū)ο蟮某绦蛟O計語言,它除了數(shù)組、布爾和字符三個基本數(shù)據(jù)類型外的其它類都是對象,它不再支持全局變量。在Java中,如果不創(chuàng)建新類就無法創(chuàng)建程序,Java程序在運行時必須先創(chuàng)建一個類的實例,然后才能提交運行。Java同樣支持繼承特性,Java的類可以從其它類中繼承行為,但Java只支持類的單重繼承,即每個類只能從一個類中繼承。Java支持界面,界面允許程序員定義方法但又不立即實現(xiàn),一個類可以實現(xiàn)多個界面,利用界面可以得到多重繼承的許多優(yōu)點而又沒有多重繼承的問題。(3) 多線程多線程使應用程序可以同時進行不同的操作,處理不同的事件。在多線程機制中,不同的線程處理不同的任務,他們之間互不干涉,不會由于一處等待影響其他部分,這樣容易實現(xiàn)網(wǎng)絡上的實時交互操作。Java程序可以有多個執(zhí)行線程,如可以讓一個線程進行復雜的計算,而讓另一個線程與用戶進行交互,這樣用戶可以在不中斷計算線程的前提下與系統(tǒng)進行交互。多線程保證了較高的執(zhí)行效率。 (4) 分布性Java是面向網(wǎng)絡的語言。通過它提供的類庫可以處理TCP/IP協(xié)議,用戶可以通過URL地址在網(wǎng)絡上很方便的訪問其他對象。(5) 體系結構中立Java是一種網(wǎng)絡語言,為使Java程序能在網(wǎng)絡的任何地方運行,Java解釋器生成與體系結構無關的字節(jié)碼結構的文件格式。Java為了做到結構中立,除生成機器無關的字節(jié)碼外,還制定了完全統(tǒng)一的語言文本,如Java的基本數(shù)據(jù)類型不會隨目標機的變化而變化,一個整型總是32位,一個長整型總是64位。為了使Java的應用程序能不依賴于具體的系統(tǒng),Java語言環(huán)境還提供了用于訪問底層操作系統(tǒng)功能的類組成的包,當程序使用這些包時,可以確保它能運行在各種支持Java的平臺上。java.lang: 一般的語言包。其中包括用于字符串處理、多線程、異常處理和數(shù)字函數(shù)等的類,該包是實現(xiàn)Java程序運行平臺的基本包java.util: 實用工具包。其中包括哈希表、堆棧、時間和日期等java.io: 基于流模型的輸入/輸出包。該包用統(tǒng)一的流模型實現(xiàn)了各種格式的輸入/輸出,包括文件系統(tǒng)、網(wǎng)絡和設備的輸入/輸出等: 網(wǎng)絡包。該包支持TCP/IP協(xié)議,其中提供了socket、URL和WWW的編程接口。java.awt: 抽象窗口工具集。其中實現(xiàn)了可以跨平臺的圖形用戶界面組件,包括窗口、菜單、滾動條和對話框等。java.applet: 支持applet程序設計的基本包。(6) 安全性用于網(wǎng)絡、分布環(huán)境下的Java必須要防止病毒的入侵,Java不支持指針,一切對內(nèi)存的訪問都必須通過對象的實例變量來實現(xiàn),這樣就防止了程序員使用欺騙手段訪問對象的私有成員,同時也避免了指針操作中容易產(chǎn)生的錯誤。1.2.4 JAVA工具1 JDK(1) Java編譯器Java編譯器將Java源代碼文件編譯成可執(zhí)行的Java字節(jié)碼。Java源代碼文件的擴展名為 .java,Java編譯器把這種擴展名的文件編譯成擴展名為.class的文件。源文件中的每個類在編譯后都將產(chǎn)生一個class文件,這意味一個Java源代碼文件可能編譯生成多個class文件。(2) Java解釋器Java解釋器對編譯生成的字節(jié)碼格式的可執(zhí)行程序的運行提供支持,它是運行非圖形Java程序的命令行工具。(3) Appletviewer它是Java Applet的簡單測試工具,可使用它來測試Java Applet程序,而不需要WWW瀏覽器的支持。2 Visual J+Visual J+ 集成了可視化界面設計、交互式調(diào)試、代碼編輯、聯(lián)機幫助信息和介紹如何快速掌握該開發(fā)環(huán)境的實用向?qū)У榷囗椆δ?,同時具有能充分利用Active X和COM新技術的優(yōu)勢。利用Visual J+可創(chuàng)建交互性很強的Internet應用程序,是難得的Java 開發(fā)系統(tǒng)。網(wǎng)絡上的系統(tǒng)結構多為客戶/服務器模式,服務器端負責數(shù)據(jù)和圖像等的存儲、維護、管理以及傳遞,客戶端則負責人機界面的操作、送出需求及顯示收回的數(shù)據(jù)。第二章 如何使用JAVA來進行網(wǎng)絡編程2.1使用JAVA來進行網(wǎng)絡編程1) 由于客戶端通過IE同服務器建立聯(lián)系,所以客戶端使用Applet,服務器端使用Application;2) 服務器應設置成多線程,應答多個客戶的請求;3) 兩端通信使用SOCKET機制。2.2客戶機/服務器通信的動機客戶機-服務器范例的基本動機來自聚集問題。為了理解這一 問題,設想一個人試圖在分離的機器上啟動兩個程序并讓它們進行通信,還要記住,計算機的運行要比人的速度快許多數(shù)量級。在某人啟動第一個程序后,該程序開始執(zhí)行并向其對等程序發(fā)送消息,在幾個微妙內(nèi),它便發(fā)現(xiàn)對等程序還不存在,于是就發(fā)出一條錯誤消息,然后退出。在這時,某個人啟動了第二個程序,不幸的是,當?shù)诙€程序開始執(zhí)行時,它發(fā)現(xiàn)對等程序已經(jīng)終止執(zhí)行了,即便是兩個程序連續(xù)重新試著通信,但由于它們每個程序執(zhí)行的速度那么快。因而它們在同一瞬間向?qū)Ψ桨l(fā)送消息的概率是很低的。 客戶機-服務器模型是這樣解決這種聚集問題的。它要求在任何一對進行通信的應用進程中,有一方必須在啟動執(zhí)行后(無限期地)等待對方的聯(lián)系,這種解決方案是重要的,因為TCP/IP自己對入呼叫通信是不會響應的。 由于TCP/IP并不是提供在一個報文到達后自動創(chuàng)建運行程序的任何機制,因此一個程序必須在任一請求到來前就在那里等待以接受通信。 因此,為確保計算機已準備好了進行通信,多數(shù)系統(tǒng)管理員都安排通信程序在操作系統(tǒng)引導時就自動啟動。每個程序都一直運行下去,以便等待下一個服務請求的到來(此服務是該程序提供的)。 2.3服務器的特權和復雜性由于服務器軟件往往需要訪問操作系統(tǒng)保護的數(shù)據(jù)、計算以及協(xié)議端口,因此服務器軟件經(jīng)常需要一些特定的系統(tǒng)特權。因為服務器軟件的執(zhí)行帶有特定的系統(tǒng)特權,為保證這樣不會粗心地將特權傳遞給使用它的客戶機,必須要小心行事。例如,一個作為特權程序運行的文件服務器,它必須要含有這樣的程序代碼,以檢查某個給定的文件是否可以被某個給定的客戶機訪問,服務器不能依賴那些通常的操作系統(tǒng)檢查,這是因為它的特權狀態(tài)將不理會那些檢查。 服務器必須含有處理以下問題的代碼: 鑒別驗證客戶機的身份 授權確定某個給定的客戶機是否被允許訪問服務器所提供的服務 數(shù)據(jù)安全確保數(shù)據(jù)不被無意泄露或損壞 保密防止對有關個人的信息進行未授權的訪問 保護確保網(wǎng)絡應用程序不能濫用系統(tǒng)資源 對那些執(zhí)行高強度計算或處理大量數(shù)據(jù)的服務器,如果并發(fā)地處理請求,其運行會更有效。這種特權和并發(fā)操作的結合使服務器的設計與實現(xiàn)較客戶機困難。 在設計客戶機應用軟件時,要包含這樣一些參數(shù),以便允許擁護全面指明目的機器以及目的協(xié)議端口號的參數(shù)。 全參數(shù)化在測試新的客戶機或服務器時特別有用,因為它允許獨立于已在使用的現(xiàn)有軟件來進行測試。例如,某個程序員可以構建一個TELNET客戶機和服務器對(pair),使用非標準的協(xié)議端口調(diào)用它們,這樣不打擾標準服務就可對軟件進行測試。在測試過程中,其他用戶可以繼續(xù)訪問舊的TELNET服務而不受影響。2.4無連接的和面向無連接的服務器在程序員設計客戶機服務器軟件時,他們必須在兩種類型的交互中做出選擇:無連接的風格或面向連接的風格。這兩種風格的交互直接對應與TCP/IP協(xié)議族所提供的兩個主要的運輸協(xié)議。如果客戶機和服務器使用UDP進行通信,那么交互就是無連接的;如果使用TCP,則交互就是面向連接的。 從應用程序員的角度看,無連接的交互和面向連接的交互之間的區(qū)別是非常重要的,因為這決定了下層系統(tǒng)所提供的可靠性等級。TCP提供了穿過一個互連網(wǎng)絡進行通信所需要的全部的可靠性。它驗證數(shù)據(jù)的到達,對未到達的報文要自動進行重傳。它還計算數(shù)據(jù)上的校驗和,以保證數(shù)據(jù)在傳輸過程中沒有損壞。它使用序列號以確保數(shù)據(jù)按序到達并自動忽略重復的分組。它提供了流量控制以確保發(fā)送方發(fā)送數(shù)據(jù)的速度不要超過接受方的承受能力。最后,如果下層網(wǎng)絡因任何原因變得無法運作,TCP將通知客戶機和服務器雙方。 與TCP相比,使用UDP的客戶機和服務器在可靠傳輸上沒有任何保證。某個客戶機發(fā)送一個請求,這個請求可能丟失、重復、延遲或者傳遞失序。類似地,服務器發(fā)回給客戶機的響應也可能丟失、重復、延遲或交付失序??蛻魴C和(或)服務器應用程序必須采取合適的行動以檢查并更正這樣的差錯。 UDP可能是不可信的,這是因為它提供的是盡最大努力交付(best effort delivery)。UDP并不引入差錯,它只是依靠下層的IP互連網(wǎng)絡來交付分組。而IP則要依賴于下層的硬件網(wǎng)絡和中間的一些網(wǎng)關。從程序員的角度看,使用UDP的后果是:如果下層的互連網(wǎng)絡工作得,UDP也就工作得好。例如,在一個本地環(huán)境下UDP工作得好,因為在本地環(huán)境下,可靠性差錯很少發(fā)生。差錯往往在通信延伸到一個廣域互連網(wǎng)時才發(fā)生。 程序員有時會犯這樣的錯誤,即選擇了無連接的運輸。例如,UDP來構建應用程序,并僅僅在一個局域網(wǎng)下測試這個應用程序。因為一個局域網(wǎng)很少甚至從不遲延分組、丟失分組或者將它們交付失序,這樣,應用軟件好像工作得很好。然而,如果同樣的軟件要穿過一個廣域互連網(wǎng)絡使用,就可能失敗或產(chǎn)生不正確的結果。 初學者以及大多數(shù)有經(jīng)驗的專業(yè)人員喜歡使用面向連接風格的交互。面向連接的協(xié)議使編程簡單,把程序員從檢查和改正差錯的責任中解脫出來。實際上,在個像UDP這樣的無連接的互連網(wǎng)報文協(xié)議中加入可靠性并非容易之舉,它要求具有相當?shù)膮f(xié)議設計經(jīng)驗。 應用程序也經(jīng)常只使用UDP。如果:(1)應用協(xié)議指明必須使用UDP(假定應用協(xié)議已設計了處理可靠性和交付差錯的內(nèi)容)。(2)應用程序協(xié)議要依靠硬件進行廣播或組播。(3)應用協(xié)議不能容忍TCP虛電路的額外的計算開銷或時延要求。我們可作如下的概括: 在設計客戶機-服務器應用時,強烈建議初學者使用TCP,因為TCP提供了可靠的、面向連接的通信。程序僅在以下情況使用UDP。如果應用協(xié)議處理可靠性,或應用協(xié)議不能容忍虛電路的額外開銷。 2.5無狀態(tài)的和有狀態(tài)的服務器 由服務器維護的、關于它與客戶機正在進行的交互的信息稱為狀態(tài)信息。不保持任何狀態(tài)信息的服務器稱作無狀態(tài)服務器(stateless server),而與此相反的稱為有狀態(tài)的服務器(stateful server)。 期望獲得高效率促使設計者在服務器中保存狀態(tài)信息。在服務器中保持少量信息可減少客戶機和服務器間交換的報文的大小,還能允許服務器快速地響應請求。從本質(zhì)上說,狀態(tài)信息允許服務器記住客戶機以前申請了什么,并在每個新的請求到來時,計算出一個增加的響應。相反,采用無狀態(tài)服務器的動機是協(xié)議的可靠性:如果報文丟失、重復或交付失序或者如果客戶機計算機崩潰或重啟動,則一個服務器中的狀態(tài)信息就會變得不正確。在服務器計算響應時,若使用了不正確的狀態(tài)信息,可能產(chǎn)生不正確的響應。 一個有狀態(tài)的服務器的例子: 考慮一個文件服務器,它允許客戶機遠程訪問保存在本地磁盤中的信息。服務器作為一個應用程序運作,它等待在網(wǎng)絡上的某個客戶機與它聯(lián)系??蛻魴C發(fā)送以下兩種請求之一,它要么發(fā)送一個從某個指定文件中獲取數(shù)據(jù)的請求或者發(fā)送一個在指定文件中存儲數(shù)據(jù)的請求。服務器執(zhí)行所請求的操作并向客戶機發(fā)回響應。 一方面,如果文件服務器是無狀態(tài)的,它是不維護事物所處理的信息。從客戶機發(fā)來的每個報文(請求服務器從某個文件獲取數(shù)據(jù)),都必須指明文件全名(名字可能相當長)、想要獲取的數(shù)據(jù)在文件內(nèi)的位置、以及想要獲取的字節(jié)數(shù)。類似地,每個要求服務器在某個文件中存儲數(shù)據(jù)的請求也必須指明文件全名、數(shù)據(jù)將存儲在文件中的位置、以及想要存儲的數(shù)據(jù)。 另一方面,如果服務器為它的客戶機維護了狀態(tài)信息,它就不必在每個報文中都傳遞文件名。服務器維護著一張表,該表保持著關于當前正被訪問的文件的狀態(tài)信息。 在理想的情況下,只要網(wǎng)絡能可靠地交付所有的報文,并且計算機從不崩潰,則在這種情況下,使服務器為每個進行著的交互保持少量狀態(tài)信息,就可以使交互的報文小些,并且處理也簡單些。 一般來說,對保持正確的狀態(tài)信息這個問題只有用復雜的協(xié)議才能解決,這種協(xié)議解決不可靠的交付和計算機系統(tǒng)重啟動的問題。概括地說: 在真實的互連網(wǎng)中,機器可能崩潰或重啟動,而報文可能丟失、重復、或交付失序。采用有狀態(tài)的設計會導致復雜的應用協(xié)議,而這種應用協(xié)議難于設計、理解和正確編程。 一個服務器到底是無狀態(tài)還是有狀態(tài)的呢?這一問題更多地集中在應用協(xié)議上,而不是在實現(xiàn)上。如果應用協(xié)議指明某個特定報文的意義在某種方式上依賴于先前的一些報文,這樣就不可能提供一種無狀態(tài)的交互。 從本質(zhì)上說,無狀態(tài)的問題關注于應用協(xié)議是否承擔可靠交付的責任。要避免出問題并使交付可靠,應用協(xié)議的設計者必須確保每個報文決無二義性,也就是說,一個報文既不能依賴于被按序交付,也不能依賴于前一個報文已被交付,關鍵是協(xié)議設計者必須這樣構建交互,即無論一個請求何時到達或多次到達,服務器都應給出相同的響應,數(shù)學家們用術語冪等(idempotent)指一個總是產(chǎn)生相同結果的數(shù)學運算。我們用這個術語制這種協(xié)議,它讓服務器對某個給定報文發(fā)出相同的響應,而不管該報文到達幾次。 如果一個互連網(wǎng)中的下層網(wǎng)絡可能使報文重復、延遲或不按序交付,或者運行客戶機應用程序的計算機可能會意外崩潰,那么對這樣的網(wǎng)絡,服務器應是無狀態(tài)的,只有應用協(xié)議設計成讓操作是冪等的,服務器才是無狀態(tài)的。第三章 網(wǎng)絡通信程序的編寫從技術上講,服務器是一個程序而不是一塊硬件。然而計算機用戶經(jīng)常(錯誤地)將這一術語用于指負責運行某個特定的服務器程序的計算機。例如,他們可能說:“那臺計算機是我們的文件服務器”,這時他們實際上指的是:“那臺計算機運行我們的文件服務器程序”。3.1客戶機和服務器 許多程序并不準確符合客戶機或服務器的定義,一個服務器程序也許需要訪問網(wǎng)絡服務,而這個服務要求該程序作為一個客戶機。例如,假設我們的文件服務器程序需要獲得本日的時間,以便在文件中打上訪問時間的標記。我們還假設運行服務器的系統(tǒng)沒有日期時間,為了獲得這個時間,該服務器就作為客戶機向日期時鐘服務器發(fā)出請求。 在一個具有許多服務器的網(wǎng)絡環(huán)境中,經(jīng)??梢园l(fā)現(xiàn)某一個應用的服務器對另一個應用則是客戶機,當然,設計人員必須小心從事以避免在這些服務器之間出現(xiàn)循環(huán)的依賴關系。因此: 客戶機服務器范例將進行通信的應用程序分為兩類即:要么是客戶機要么是服務器,這取決于它是否發(fā)起通信。除了為標準應用設計的客戶機和服務器軟件外,許多TCP/IP用戶為其自定義的非標準的應用構建了客戶機和服務器軟件。 初學者以及多數(shù)有經(jīng)驗的程序員使用TCP在客戶機與服務器之間運輸報文,因為TCP提供了互連網(wǎng)絡環(huán)境所需要的可靠性。程序員只有在TCP不能解決問題時才選擇UDP。 在服務器中保持狀態(tài)信息可以提高效率。然而,如果客戶機意外崩潰或者下層的傳輸網(wǎng)絡允許重復、延遲或分組丟失則狀態(tài)信息會消耗資源或者變得不正確。因此,多數(shù)應用協(xié)議設計者努力減少狀態(tài)信息。如果應用協(xié)議不能使操作成為冪等的,就可能不能使用無狀態(tài)的服務器。 各種程序不能簡單地劃分為客戶機和服務器這兩類,這是因為許多程序同時具有客戶機和服務器這兩種功能。一個程序?qū)δ硞€服務來說是服務器,但它又可作為客戶機訪問其他的服務。 3.2客戶機和服務器的實現(xiàn)在應用層,客戶-服務器(Client/Server)是典型的Web信息系統(tǒng)模式。客戶-服務器一詞在20世紀80年代首先被提出,起初,主要指個人計算機和Web的連接,在互聯(lián)網(wǎng)中,主要指計算機系統(tǒng)之間通過Web的信息交互傳遞模式;客戶是指信息服務的索取方,服務器指服務的提供方,根據(jù)軟件的不同設置,一臺計算機可以是客戶也可以是服務器。隨著Web科技的發(fā)展,客戶-服務器軟件框架成為一種靈活、分布式和模塊化的信息系統(tǒng)結構。與客戶-服務器軟件框架相反的結構是大型集中式主機。這種結構將主要運算操作放在中心計算機上。同集中式大型計算系統(tǒng)比較,客戶-服務器結構的主要優(yōu)點是提供了良好的實用性、靈活性、交互性和可擴展性??蛻?服務器以數(shù)據(jù)庫服務器取代集中式文件共享進而實現(xiàn)了計算機系統(tǒng)之間的松耦合。 由于客戶并非完全依靠服務器,計算機之間可以更動態(tài)地進行協(xié)作。這樣擴大了計算機聯(lián)網(wǎng)的范圍,同時降低了Web流量??蛻艉头掌髦g在企業(yè)內(nèi)部網(wǎng)(Intranet)中主要通過遠程過程調(diào)用(remote procedure call)和SQL數(shù)據(jù)庫檢索語言,在因特網(wǎng)(Internet)上可以通過HTTP、telnet、FTP等協(xié)議進行通信。Web程序客戶-服務器模式衍生出了不同體系結構,如雙層結構、三層結構和分布式結構等。它們適用于不同的情況。雙層結構(2-tier architecture),通常將客戶端程序作為界面,而將數(shù)據(jù)庫置于服務器上;一臺服務器上的數(shù)據(jù)庫同時支持多個用戶(一般是個人計算機),數(shù)據(jù)處理過程由客戶界面和數(shù)據(jù)庫管理系統(tǒng)(database management systems)協(xié)調(diào)進行,數(shù)據(jù)庫管理系統(tǒng)(如Oracle,DB2,MySQL等)提供現(xiàn)成的方法供用戶調(diào)用,用戶也可以在其基礎之上進行開發(fā);雙層結構的Web系統(tǒng)適用于少量用戶在局域網(wǎng)內(nèi)對數(shù)據(jù)進行操作,但是當客戶數(shù)量超過數(shù)百時,由于雙層結構系統(tǒng)和大量的客戶保持聯(lián)系,處理速度往往難以滿足要求,另外,由于雙層結構系統(tǒng)對數(shù)據(jù)庫的依賴性很強,系統(tǒng)的維護和更新常常令人頭疼,當服務器的機器升級或更新時,軟件系統(tǒng)的重新安裝和調(diào)試非常麻煩。 三層結構(3-tier architecture)彌補了雙層結構的不足;在客戶界面和數(shù)據(jù)庫之間加入了完善系統(tǒng)功能的中間層(middle tier),典型的中間層可以是事務處理控制器(transaction processing monitor)、消息服務器(message server)、應用服務器(application server)等;在客戶界面與數(shù)據(jù)庫之間,中間層支持數(shù)據(jù)檢索、程序的分布式運行和數(shù)據(jù)庫狀態(tài)控制,中間層像是數(shù)據(jù)的周轉和分配站,客戶界面不再直接獲取數(shù)據(jù),而是通過中間層提供的接口間接訪問和更新數(shù)據(jù),中間層可以協(xié)調(diào)和優(yōu)化各種處理進程,這樣,對于大量客戶使用的系統(tǒng),三層結構的主要特點是能提高用戶的使用效率,同時提高程序的可移植性;由于中間層使用標準化的接口,使Web程序無需改動就能在不同機器上運行,由于三層結構系統(tǒng)比雙層結構復雜,程序開發(fā)人員需要掌握和考慮多種技術因素,例如如何維護數(shù)據(jù)交換一致,如何保證安全等。3.3客戶機-服務器范例的應用客戶機-服務器范例用發(fā)起通信的方向來對程序分類,即區(qū)別一個程序是客戶機還是服務器。一般地講,發(fā)起對等通信的應用程序叫客戶機。端用戶往往在其使用網(wǎng)絡服務時調(diào)用客戶機軟件。多數(shù)客戶機軟件由常規(guī)的應用程序構成??蛻魴C應用程序每次執(zhí)行都要向服務器進行聯(lián)系、發(fā)送申請已經(jīng)等待響應。當響應到達時,客戶機再繼續(xù)處理??蛻魴C常常較服務器易于構建,它的運行往往并不需要特殊的系統(tǒng)特權。 比較而言,服務器是等待來自客戶機的入呼叫通信請求的任何一種程序。服務器接收某個客戶機的請求,執(zhí)行所需的計算然后將結果返回給客戶機。3.4 Application 同 Applet 的通信兩端通過Socket機制進行連接:1. 客戶端的編程流程:(1) 打開Socket,新建一個套接字;(2) 為套接字建立一個輸入和輸出流;(3) 根據(jù)服務器協(xié)議從套接字讀入或向套接字寫入;(4) 清除套接字和輸入/輸出流;2) 服務器端的編程流程:(1) 打開Server Socket,創(chuàng)建一個服務器型套接字和一個普通套接字,服務器型套接字在指定端口為客戶端請求的Socket 服務;(2) 使用ServerSocket類的accept()方法使服務器型套接字處于監(jiān)聽狀態(tài)并把監(jiān)聽結果返回給普通套接字;(3) 為該普通套接字創(chuàng)建輸入和輸出流;(4) 從輸入和輸出流中讀入或?qū)懭胱止?jié)流,進行相應的處理,并將結果返回給客戶端;(5) 在客戶端和服務器工作結束后關閉所有的對象,如服務器型的套接字,普通套接字,輸入和輸出流。正是由于Java系統(tǒng)具有基于Socket的靈活通信機制,因而其應用程序能自由地打開和訪問網(wǎng)絡上的對象,就象在本地文件系統(tǒng)中一樣。3.5 Applet之間的通信Applet之間的通信使用Applet Context類的getApplet()方法。只要在程序中加入 Applet oneapplet=getAppletContext().getApplet(“first”);便可使用name為first的Applet中的方法了。在該課題中大量使用了該種通信方法,因為專門同服務器端通信的 Applet中包含接收信息方法和發(fā)送信息方法,所有客戶端的負Applet都要使用責通信的Applet中的方法,所以客戶端的Applet同負責通信的Applet必須進行通信。3.6 程序/服務器端程序S.java 負責與客戶端通信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(); /從客戶端得到字符串/在此加入各自的服務程序System.out.println (str);theT2.pass(str); /解碼theT2.tongji( ); /修改監(jiān)控庫中的信息aa=theT2.guan( );/操縱數(shù)據(jù)庫System.out.println (string z is:+aa);if(pareTo(null)!=0 ) /若是查詢數(shù)據(jù)庫,返回查詢后的結果/若不是查詢數(shù)據(jù)庫,不向客戶端輸出信息 out.writeUTF(aa);out.flush( ); /while incoming.close( ); /線程關閉/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); /客戶端通信小應用程序 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); /與服務器建立連接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 ); /向服務器輸送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(); /從服務器讀來的信息ta.appendText(+Line); /在文本域中輸出信息catch(IOException e)System.out.println( error:+e); return Line;所謂socket通常也稱作套接字,用于描述IP地址和端口,是一個通信鏈的句柄。應用程序通常通過套接字向網(wǎng)絡發(fā)出請求或者應答網(wǎng)絡請求。 Socket和ServerSocket類庫位于包中。ServerSocket用于服務器端,Socket是建立網(wǎng)絡連接時使用的。在連接成功時,應用程序兩端都會產(chǎn)生一個Socket實例,操作這個實例,完成所需的會話。對于一個網(wǎng)絡連接來說,套接字是平等的,并沒有差別,不因為在服務器端或在客戶端而產(chǎn)生不同級別。不管是Socket還是ServerSocket它們的工作都是通過SocketImpl類及其子類完成的。 下面給出一個最簡單的Socket通信的例子供初學者參考: 服務器端: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ā)送與接收是需要同步進行的,即客戶端發(fā)送一條信息,服務器必需先接收這條信息, * 而后才可以向客戶端發(fā)送信息,否則將會有運行時出錯。 * param args */ public static void m
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度生物科技產(chǎn)業(yè)孵化基地租賃合同書
- 2025年度建筑防水工程合同范本
- 2025年度航空航天設備維護工程師專項合同
- 二零二五年度模特隱私權保護與形象使用合同
- 2025年度智慧醫(yī)療信息化系統(tǒng)建設與運營協(xié)議
- 2025年搜索引擎SEO快速排名提升與維護合同
- 2025年度知識產(chǎn)權居間轉讓合同范本與法律風險防范
- 2025年度建筑工程監(jiān)理與咨詢合同
- 2025年度灌溉設施維護保養(yǎng)與應急搶修合同
- 2025年度企業(yè)財務預算管理與控制合同范本
- 臨床護理實踐指南2024版
- 勞動合同(模版)4篇
- (高清版)TDT 1055-2019 第三次全國國土調(diào)查技術規(guī)程
- SWITCH塞爾達傳說曠野之息-1.6金手指127項修改使用說明教程
- 2022質(zhì)檢年終工作總結5篇
- 國際商務談判雙語版課件(完整版)
- 物業(yè)管理應急預案工作流程圖
- (高清正版)T_CAGHP 003—2018抗滑樁治理工程設計規(guī)范 (試行)
- 畢業(yè)論文論財務管理是企業(yè)管理的核心
- 清潔化施工無土化安裝施工方案
- 物業(yè)小區(qū)常規(guī)保潔工作程序
評論
0/150
提交評論