(精品論文)畢業(yè)論文使用java編寫網(wǎng)絡(luò)通信程序_第1頁
(精品論文)畢業(yè)論文使用java編寫網(wǎng)絡(luò)通信程序_第2頁
(精品論文)畢業(yè)論文使用java編寫網(wǎng)絡(luò)通信程序_第3頁
(精品論文)畢業(yè)論文使用java編寫網(wǎng)絡(luò)通信程序_第4頁
(精品論文)畢業(yè)論文使用java編寫網(wǎng)絡(luò)通信程序_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

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

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論