畢業(yè)論文---網(wǎng)絡(luò)棋牌游戲平臺(tái)的設(shè)計(jì)與實(shí)現(xiàn)_第1頁(yè)
已閱讀1頁(yè),還剩42頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、<p><b>  本科畢業(yè)設(shè)計(jì)</b></p><p><b>  摘 要</b></p><p>  本文設(shè)計(jì)討論了Socket機(jī)制,闡述了使用Java語(yǔ)言編寫基于客戶/服務(wù)器模式的網(wǎng)絡(luò)通訊程序方法。服務(wù)器的一個(gè)必需機(jī)能,就是能對(duì)多個(gè)客戶的請(qǐng)求同時(shí)做出響應(yīng)。利用Java 的Socket 機(jī)制和多線程機(jī)制進(jìn)行多用戶的Client

2、/Server網(wǎng)絡(luò)程序設(shè)計(jì)。Socket是基于 TCP/IP的網(wǎng)絡(luò)上運(yùn)行的兩個(gè)程序間雙向通訊的一種連接機(jī)制 Java.net包中包含Socket類,用以快速地開發(fā)網(wǎng)絡(luò)通信程序。在TCP/IP協(xié)議體系結(jié)構(gòu)的基礎(chǔ)上,分析了網(wǎng)絡(luò)通信原理,結(jié)合Socket 總結(jié)出網(wǎng)絡(luò)通信編程的基本模型,介紹Java的網(wǎng)絡(luò)編程實(shí)現(xiàn)。主要是對(duì)Socket類和Server Socket類的調(diào)用。</p><p>  Socket類主要實(shí)現(xiàn)客戶

3、端套接字(也可以就叫“套接字”)。套接字是兩臺(tái)機(jī)器之間的通信端點(diǎn)。套接字的實(shí)際工作由 SocketImpl 類的實(shí)例執(zhí)行。</p><p>  Server Socket類類實(shí)現(xiàn)服務(wù)器套接字。服務(wù)器套接字等待請(qǐng)求通過網(wǎng)絡(luò)傳入。它基于該請(qǐng)求執(zhí)行某些操作,然后可能向請(qǐng)求者返回結(jié)果。服務(wù)器套接字的實(shí)際工作由 SocketImpl 類的實(shí)例執(zhí)行。</p><p>  通過對(duì)網(wǎng)絡(luò)通信編程知識(shí)的掌握和

4、運(yùn)用Java語(yǔ)言來(lái)實(shí)現(xiàn)一種簡(jiǎn)單的網(wǎng)絡(luò)棋牌室平臺(tái),主要包括一種游戲和聊天功能。</p><p>  關(guān)鍵詞:Java Socket;網(wǎng)絡(luò)編程;套接字;流套接字</p><p><b>  ABSTRACT</b></p><p>  This article discussed the socket mechanism, and elaborat

5、ed how to write the java program based on the customer/server pattern. Socket is one of the two-way communication’s end between two procedures that are operated on the network based on TCP/IP. Java.net bag includes Scoke

6、ts, which is used to develop the network communication procedure fast. One of the necessary functions of severs is to respond to multi-users simultaneously. The paper gives an introduction of the client/server network pr

7、oce</p><p>  Socket class implements client sockets (also called just "sockets"). A socket is an endpoint for communication between two machines. The actual work of the socket is performed by an in

8、stance of the SocketImpl class. </p><p>  ServerSocket class implements server sockets. A server socket waits for requests to come in over the network. It performs some operation based on that request, and t

9、hen possibly returns a result to the requester. The actual work of the server socket is performed by an instance of the SocketImpl class. </p><p>  Through predominate the knowledge of network communication

10、programming and use the language of Java to implement a simple flat roof of net chess room, the mostly contain a sort of game and a function of chat.</p><p>  Key words:Java Socket; network programming; sock

11、et; stream socket</p><p><b>  目 錄</b></p><p><b>  1 引言1</b></p><p><b>  2 概述2</b></p><p>  2.1 問題的提出2</p><p> 

12、 2.1.1 當(dāng)前網(wǎng)絡(luò)棋牌平臺(tái)的發(fā)展概況2</p><p>  2.1.2 網(wǎng)絡(luò)棋牌室平臺(tái)的繼續(xù)發(fā)展2</p><p>  2.2 解決方案3</p><p>  2.3 開發(fā)工具和平臺(tái)3</p><p>  2.3.1 面向?qū)ο蟪绦蚋攀?</p><p>  2.3.2 利用Java語(yǔ)言進(jìn)行網(wǎng)絡(luò)

13、編程的優(yōu)勢(shì)4</p><p>  2.3.3 Socket的概述5</p><p><b>  3 系統(tǒng)分析9</b></p><p>  3.1 系統(tǒng)可行性9</p><p>  3.2 系統(tǒng)應(yīng)達(dá)到的標(biāo)準(zhǔn)9</p><p>  3.3 網(wǎng)絡(luò)棋牌友游戲平臺(tái)工作原理9</

14、p><p>  4 系統(tǒng)模塊設(shè)計(jì)11</p><p>  4.1 模塊組織圖11</p><p>  4.2 Socket流程圖12</p><p>  4.3 模塊功能介紹13</p><p>  5 詳細(xì)設(shè)計(jì)15</p><p>  5.1 通信技術(shù)15</p>

15、;<p>  5.1.1 C/S模式15</p><p>  5.1.2 Java中的網(wǎng)絡(luò)編程15</p><p>  5.1.3 Java在Client/Server 網(wǎng)絡(luò)中的應(yīng)用16</p><p>  5.1.4 Java套接字編程主要類和函數(shù)18</p><p>  5.1.5 套接字編程的系統(tǒng)流程2

16、0</p><p>  5.2軟件界面設(shè)計(jì)21</p><p>  5.3 模塊分析22</p><p>  5.3.1 服務(wù)器框架模塊22</p><p>  5.3.2 服務(wù)器信息顯示模塊23</p><p>  5.3.3 服務(wù)器控制模塊26</p><p>  5.3.

17、4 客戶端框架模塊27</p><p>  5.3.5 游戲運(yùn)行模塊28</p><p>  5.3.6 游戲控制模塊30</p><p>  5.3.7 用戶聊天模塊31</p><p>  5.3.8 用戶信息模塊32</p><p>  6 調(diào)試與測(cè)試34</p><p

18、>  6.1 調(diào)試中遇到的主要問題34</p><p>  6.2 測(cè)試中遇到的主要問題34</p><p><b>  結(jié)論35</b></p><p><b>  致謝36</b></p><p><b>  參考文獻(xiàn)37</b></p>

19、<p><b>  1 引言</b></p><p>  網(wǎng)絡(luò)棋牌游戲平臺(tái)在在目前的休閑游戲市場(chǎng)上有著很大份額,給用戶提供一個(gè)相互交流學(xué)習(xí)的平臺(tái),也是目前大多數(shù)網(wǎng)民娛樂的主要方式。</p><p>  而時(shí)下,無(wú)論是網(wǎng)絡(luò)游戲還是單機(jī)游戲,真正適合中小學(xué)生玩的具有寓教于樂意義的游戲可謂少之又少,且后繼乏力。而血腥暴力游戲?qū)η嗌倌甑倪^度侵蝕,則在很大程度上成為

20、引發(fā)近來(lái)青少年社會(huì)問題的直接誘因之一。但一味的封堵青少年玩游戲近乎不可能,多年前禁止青少年逗留三室兩廳的成效不太理想的情景,如今還歷歷在目。唯一可取之法就是開源節(jié)流,以大禹之“導(dǎo)”代替鯀之“堵”,盡可能的將黃色暴力游戲,這一對(duì)青少年身心健康有極大影響的洪水猛獸的巨大破壞力消弭無(wú)形。在這種形式下,涉足教育的網(wǎng)絡(luò)游戲便應(yīng)時(shí)而生,成為了一個(gè)熱門話題。在當(dāng)今如此盛行網(wǎng)絡(luò)游戲的時(shí)代,教育網(wǎng)游的誕生不能不說是一個(gè)絕好的切入點(diǎn)。</p>

21、<p>  因此網(wǎng)絡(luò)棋牌游戲就更適合于教育網(wǎng)游。與一般傳統(tǒng)的角色扮演類游戲相比網(wǎng)絡(luò)棋牌游戲的開發(fā)更適合于如今網(wǎng)游的發(fā)展趨勢(shì),使得更多的人從事于網(wǎng)絡(luò)棋牌游戲平臺(tái)的開發(fā),從另一方面更可以使如今的青少年遠(yuǎn)離一些血腥暴力游戲所帶來(lái)的危害。益智休閑類游戲不僅滿足青少年對(duì)游戲的需要,也是一中促進(jìn)智力發(fā)展的手段。</p><p>  用Java語(yǔ)言對(duì)本次對(duì)網(wǎng)絡(luò)棋牌游戲平臺(tái)的設(shè)計(jì)可以比較深入的了解Java的Socke

22、t網(wǎng)絡(luò)編程,對(duì)客戶端和服務(wù)器的設(shè)計(jì)更能對(duì)兩臺(tái)主機(jī)之間的連接的Socket進(jìn)行七項(xiàng)基本的操作如:</p><p>  連接遠(yuǎn)程機(jī)器、發(fā)送數(shù)據(jù)、接收數(shù)據(jù)、關(guān)閉連接、綁定端口、監(jiān)聽入站數(shù)據(jù),在所綁定端口上接收來(lái)自遠(yuǎn)程機(jī)器的連接。</p><p>  主要研究的內(nèi)容是使用JAVA Network API操縱套接字和對(duì)多種API的調(diào)用來(lái)設(shè)計(jì)服務(wù)器和客戶端的界面設(shè)計(jì)。</p><p

23、>  準(zhǔn)備解決的問題是客戶間的通信和一種簡(jiǎn)單游戲的實(shí)現(xiàn)。</p><p><b>  2 概述</b></p><p>  2.1 問題的提出</p><p>  由于國(guó)內(nèi)的軟件開發(fā)的起步晚于國(guó)外,導(dǎo)致國(guó)內(nèi)的網(wǎng)絡(luò)游戲的平臺(tái)開發(fā)都依賴于國(guó)外的支持,隨著時(shí)間的推移技術(shù)的發(fā)展使得國(guó)內(nèi)的軟件有了大幅度的提升。國(guó)內(nèi)網(wǎng)絡(luò)游戲市場(chǎng)處于高速發(fā)展階段,

24、市場(chǎng)規(guī)模與用戶數(shù)都高速增長(zhǎng)。一億多的互聯(lián)網(wǎng)用戶上網(wǎng)的最主要?jiǎng)訖C(jī)是休閑娛樂,而網(wǎng)絡(luò)游戲是休閑娛樂的主要形式。網(wǎng)絡(luò)游戲是以互聯(lián)網(wǎng)為依托,可以使用不同的游戲終端、多人同時(shí)參與的游戲活動(dòng)。網(wǎng)絡(luò)游戲有多種類型,按照游戲內(nèi)容架構(gòu)可以分為角色扮演類(MMORPG)、休閑類(包括動(dòng)作類、經(jīng)營(yíng)類、棋牌類)和益智類。和其它網(wǎng)絡(luò)游戲相比,線上棋牌娛樂平臺(tái)無(wú)論是在用戶基數(shù),用戶穩(wěn)定忠實(shí)性上,還是在提供的產(chǎn)品服務(wù)上,都有顯著的優(yōu)勢(shì)和區(qū)別。游戲的發(fā)展還是隨著對(duì)市場(chǎng)

25、的適應(yīng),教育網(wǎng)游是時(shí)下比較提倡的一種方式從而休閑游戲平臺(tái)的設(shè)計(jì)就變的有意義,提出網(wǎng)絡(luò)棋牌室平臺(tái)的設(shè)計(jì)和實(shí)現(xiàn)的課題。</p><p>  2.1.1 當(dāng)前網(wǎng)絡(luò)棋牌平臺(tái)的發(fā)展概況</p><p>  國(guó)內(nèi)在網(wǎng)絡(luò)棋牌游戲平臺(tái)的開發(fā)道路上,作為我國(guó)第一家棋牌類游戲網(wǎng)站,聯(lián)眾公司有一定的代表性。聯(lián)眾是中國(guó)第一個(gè)完全以棋牌游戲競(jìng)技為經(jīng)營(yíng)核心的網(wǎng)站。三年前,國(guó)內(nèi)的用戶只能到國(guó)外的網(wǎng)站上才能玩到在線棋牌

26、游戲,只能接受非民族化的游戲服務(wù)。聯(lián)眾的出現(xiàn)填補(bǔ)了這個(gè)空白,徹底改變了這種狀況,開創(chuàng)了第一個(gè)繼承發(fā)揚(yáng)中國(guó)文化特色的互聯(lián)網(wǎng)游戲。目前國(guó)內(nèi)的棋牌游戲平臺(tái)包括QQ游戲、聯(lián)眾、中游,以及近來(lái)收歸盛大旗下的邊鋒,全國(guó)過億的在線棋牌游戲玩家當(dāng)中,幾乎絕大部分都分布在此幾家的游戲平臺(tái)之上,每日的黃金時(shí)段里,這幾大平臺(tái)的同時(shí)在線人數(shù)已達(dá)到數(shù)百萬(wàn)之巨。他們都形成了較為成熟的贏利模式,如網(wǎng)絡(luò)廣告、與電信供應(yīng)商分成、會(huì)員制度、產(chǎn)品銷售、電子商務(wù)、舉辦競(jìng)賽及收

27、費(fèi)游戲等。</p><p>  2.1.2 網(wǎng)絡(luò)棋牌室平臺(tái)的繼續(xù)發(fā)展</p><p>  從前,在對(duì)平臺(tái)的設(shè)計(jì)上實(shí)現(xiàn)的功能只是完成簡(jiǎn)單的一種網(wǎng)絡(luò)棋牌游戲?qū)暮土奶?,而如今的網(wǎng)絡(luò)平臺(tái)都講究更多的交流和互動(dòng)性,特別在對(duì)游戲的設(shè)計(jì)上更多的是針對(duì)地區(qū)性的棋牌游戲的設(shè)計(jì)來(lái)吸收更多的地方用戶。從總體的調(diào)查上來(lái)看以前的棋牌游戲都過多的基于大眾方面來(lái)對(duì)游戲的設(shè)計(jì),現(xiàn)在更多的投入就在于對(duì)游戲設(shè)計(jì)的針對(duì)性。

28、從用戶的方面看來(lái)用戶對(duì)自己所在地方的有地方特色的游戲的興趣度遠(yuǎn)遠(yuǎn)高于一般的游戲規(guī)則?,F(xiàn)在各家棋牌游戲平臺(tái)公司都在吸收更多的用戶來(lái)獲得更多的盈利,因此網(wǎng)絡(luò)棋牌的發(fā)展越來(lái)越趨進(jìn)于多元化地方化,平臺(tái)上所能提供的服務(wù)也在不斷的完善。</p><p><b>  2.2 解決方案</b></p><p>  要開發(fā)一個(gè)簡(jiǎn)單功能實(shí)現(xiàn)的網(wǎng)絡(luò)棋牌室平臺(tái),具有一種游戲的實(shí)現(xiàn)和達(dá)到用戶

29、間交流的目的,各種控鍵都比較容易使用。</p><p>  第一、服務(wù)器設(shè)計(jì):用Java中各種類的調(diào)用完成框架的設(shè)計(jì),所擁有的功能則是能夠完成一些信息的輸出主要包括本地的IP地址用戶登入的信息和公共聊天的內(nèi)容,在控制的按鍵上則有清除顯示、服務(wù)器狀況、關(guān)閉服務(wù)器選項(xiàng)。</p><p>  第二、客戶端設(shè)計(jì):用Java中各種類的調(diào)用完成框架的設(shè)計(jì),主界面上有四塊面版包括userpad、chat

30、pad、chesspad、controlpad、inputpad。用來(lái)實(shí)現(xiàn)連接服務(wù)器、創(chuàng)建游戲、加入游戲、聊天等功能。</p><p>  第三、通過Java網(wǎng)絡(luò)編程中的socket編程來(lái)實(shí)現(xiàn)服務(wù)器和客戶端的通訊,從而實(shí)現(xiàn)一中平臺(tái)的設(shè)計(jì),來(lái)滿足用戶間的交流和對(duì)弈。</p><p>  2.3 開發(fā)工具和平臺(tái)</p><p>  JCreator 是一個(gè)Java程序

31、開發(fā)工具,也是一個(gè)Java集成開發(fā)環(huán)境(IDE)。無(wú)論你是要開發(fā)Java應(yīng)用程序或者網(wǎng)頁(yè)上的Applet元件都難不倒它。在功能上與Sun公司所公布的JDK等文字模式開發(fā)工具相較之下來(lái)得容易,還允許使用者自訂義操作窗口界面及無(wú)限Undo/Redo等功能。  JCreator為用戶提供了相當(dāng)強(qiáng)大的功能,例如項(xiàng)目管理功能,項(xiàng)目模板功能,可個(gè)性化設(shè)置語(yǔ)法高亮屬性、行數(shù)、類瀏覽器、標(biāo)簽文檔、多功能編繹器,向?qū)Чδ芤约巴耆勺远x的用戶界面。通過

32、JCreator,我們不用激活主文檔而直接編繹或運(yùn)行我們的JAVA程序?! Creator能自動(dòng)找到包含主函數(shù)的文件或包含Applet的Html文件,然后它會(huì)運(yùn)行適當(dāng)?shù)墓ぞ?。在JCreator中,我們可以通過一個(gè)批處理同時(shí)編譯多個(gè)項(xiàng)目。JCreator的設(shè)計(jì)接近Windows界面風(fēng)格,用戶對(duì)它的界面比較熟悉。其最大特點(diǎn)是與我們機(jī)器中所裝的JDK完美結(jié)合,是其它任何一款I(lǐng)DE所不能比擬的。它是一種初學(xué)者很容易上手的java開發(fā)工具,缺

33、點(diǎn)是只能進(jìn)行簡(jiǎn)單的程序開發(fā),不能進(jìn)行企業(yè)J2EE的開發(fā)應(yīng)用。</p><p>  基于以上考慮,我決定采用JCreator作為開發(fā)這個(gè)軟件的工具,以Windows作為這個(gè)軟件的運(yùn)行平臺(tái)。</p><p>  2.3.1 面向?qū)ο蟪绦蚋攀?lt;/p><p>  面向?qū)ο笃鋵?shí)是現(xiàn)實(shí)世界模型的自然延伸。現(xiàn)實(shí)世界中任何實(shí)體都可以看作是對(duì)象。對(duì)象之間通過消息相互作用。另外,現(xiàn)

34、實(shí)世界中任何實(shí)體都可歸屬于某類事物,任何對(duì)象都是某一類事物的實(shí)例。如果說傳統(tǒng)的過程式編程語(yǔ)言是以過程為中心以算法為驅(qū)動(dòng)的話,面向?qū)ο蟮木幊陶Z(yǔ)言則是以對(duì)象為中心以消息為驅(qū)動(dòng)。用公式表示,過程式編程語(yǔ)言為:程序=算法+數(shù)據(jù);面向?qū)ο缶幊陶Z(yǔ)言為:程序=對(duì)象+消息。</p><p>  面向?qū)ο笤O(shè)計(jì)方法具有四個(gè)基本特征:抽象、封裝、繼承和多態(tài)性。</p><p>  抽象(abstract)就是忽

35、略一個(gè)問題中與當(dāng)前目標(biāo)無(wú)關(guān)的那些方面,以便將注意力放在與當(dāng)前目標(biāo)有關(guān)的方面。抽象并不打算解決全部問題,而只是選擇其中的一部分,暫時(shí)不考慮一些細(xì)節(jié)問題。抽象包括過程抽象和數(shù)據(jù)抽象,過程抽象是指任何一個(gè)明確定義功能的操作都可被使用作為單個(gè)的實(shí)體看待,盡管這個(gè)操作實(shí)際上可能由一系列更低級(jí)的操作來(lái)完成;數(shù)據(jù)抽象定義了數(shù)據(jù)類型和施加于該類型對(duì)象上的操作。</p><p>  封裝(encapsulation)是面向?qū)ο蟪绦?/p>

36、設(shè)計(jì)的一個(gè)主要特征。封裝就是把每個(gè)對(duì)象的數(shù)據(jù)(屬性)和操作(方法)包裝在一個(gè)類中。一旦定義了對(duì)象的屬性和行為,則必須決定哪些屬性和行為用于表示內(nèi)部狀態(tài),哪些屬性和行為在外部是可見的。一般限制直接訪問對(duì)象的屬性,而應(yīng)通過操作接口訪問,這樣使程序中模塊之間關(guān)系更簡(jiǎn)單、數(shù)據(jù)更安全。對(duì)程序的修改也僅限于類的內(nèi)部,使得由于修改程序所帶來(lái)的影響局部化。</p><p>  繼承(inheritance)是指一個(gè)新類可以從現(xiàn)有

37、的類派生而來(lái)。新類繼承了現(xiàn)有類的特性,包括一些屬性和行為,并且可以修改或增加新的屬性和行為,使之適合具體的需要。例如,所有的Windows應(yīng)用程序都有一個(gè)窗口,它們可以看作都是從一個(gè)窗口類派生出來(lái)的,但有的應(yīng)用程序用于文字處理,有的則用于繪圖,這是由于派生出了不同的類,它們?cè)黾恿瞬煌膶傩院托袨?。繼承很好地解決了軟件的可重用性問題。</p><p>  多態(tài)性(polymorphism)是指允許不同類的對(duì)象對(duì)同一

38、消息作出的響應(yīng)不相同。例如,同樣的“編輯|粘貼”操作,在字處理程序和繪圖程序中有不同的結(jié)果;同樣的加法,把兩個(gè)時(shí)間值相加和把兩個(gè)整數(shù)相加的要求肯定不同。多態(tài)性使程序設(shè)計(jì)靈活、抽象,具有行為共享和代碼共享的優(yōu)點(diǎn),很好地解決了程序的函數(shù)同名問題。</p><p>  通過使用面向?qū)ο蟪绦蛟O(shè)計(jì)的抽象、封裝、繼承和多態(tài)性等機(jī)制,程序更易于維護(hù)、更新和升級(jí)。利用代碼可重用性,程序員可以在程序中大量使用程序的類庫(kù),從而縮短程

39、序的開發(fā)時(shí)間,提高程序員的工作效率和程序的可靠性。</p><p>  2.3.2 利用Java語(yǔ)言進(jìn)行網(wǎng)絡(luò)編程的優(yōu)勢(shì)</p><p>  Java是一種跨平臺(tái),適合于分布式計(jì)算環(huán)境的面向?qū)ο缶幊陶Z(yǔ)言。具體來(lái)說,它具有如下特性:簡(jiǎn)單性、面向?qū)ο?、分布式、解釋型、可靠、安全、平臺(tái)無(wú)關(guān)、可移植、高性能、多線程、動(dòng)態(tài)性等。與C++等語(yǔ)言相比較,語(yǔ)法上Java是簡(jiǎn)單的。</p>&

40、lt;p>  Java提供了垃圾回收機(jī)制。以往C++的開發(fā)中,最容易出錯(cuò)誤的地方便是內(nèi)存管理,申請(qǐng)的內(nèi)存用完以后必須釋放,否則可使用的內(nèi)存資源越來(lái)越少,直至耗盡系統(tǒng)資源而造成死機(jī)。而Java系統(tǒng)中,你可以任意申請(qǐng)內(nèi)存,Java系統(tǒng)會(huì)在適當(dāng)?shù)臅r(shí)候自動(dòng)釋放無(wú)用的內(nèi)存資源。這個(gè)神奇的機(jī)制叫做“垃圾回收”,節(jié)約了許多調(diào)試錯(cuò)誤的時(shí)間。</p><p>  在Java中,要寫出低劣的代碼也不是一件容易的事情。一方面,垃

41、圾回收機(jī)制堵住了內(nèi)存泄漏的可能性,另一方面就是異常捕捉機(jī)制,它強(qiáng)迫你做最壞的打算。編寫程序時(shí),難免會(huì)遇到一些意外,比如文件無(wú)法打開、網(wǎng)絡(luò)讀取失敗等特殊情況。在C++等語(yǔ)言中是依靠返回值來(lái)判斷的,如果一句句地檢查返回值,那實(shí)在是太麻煩了。從而,程序員習(xí)慣性地忽略返回值的檢查,并安慰自己一切都會(huì)好起來(lái)的。這便埋下了隱患。在Java中,Java的方法可以拋異常,而你必須應(yīng)答異常,即使你不想進(jìn)行任何操作。比如編寫打開文件的代碼,你不得不響應(yīng)異常

42、以防意外發(fā)生,否則程序根本不能夠通過編譯。未雨綢繆,使得Java系統(tǒng)更穩(wěn)健。</p><p>  Java語(yǔ)言是第一個(gè)完全融入網(wǎng)絡(luò)的語(yǔ)言,它之所以適合編寫網(wǎng)絡(luò)應(yīng)用程序,歸功于它的以下優(yōu)勢(shì)。</p><p>  (1)Java語(yǔ)言與生俱來(lái)就是與平臺(tái)無(wú)關(guān)的。Java程序能夠運(yùn)行在不同的平臺(tái)上,運(yùn)行在不同平臺(tái)上的Java程序能夠方便地進(jìn)行網(wǎng)絡(luò)通信。</p><p>  (

43、2)Java語(yǔ)言具有完善的安全機(jī)制,可以對(duì)程序進(jìn)行權(quán)限檢查,這對(duì)網(wǎng)絡(luò)程序至關(guān)重要。</p><p>  (3)JDK類庫(kù)提供了豐富的網(wǎng)絡(luò)類庫(kù),如套接字API、JavaMail API和JDBC API等,大大簡(jiǎn)化了網(wǎng)絡(luò)程序的開發(fā)過程。</p><p>  2.3.3 Socket的概述</p><p>  Network API是典型的用于基于TCP/IP網(wǎng)絡(luò)Ja

44、va程序與其他程序通訊,Network API依靠Socket進(jìn)行通訊。Socket可以看成在兩個(gè)程序進(jìn)行通訊連接中的一個(gè)端點(diǎn),一個(gè)程序?qū)⒁欢涡畔懭隨ocket中,該Socket將這段信息發(fā)送給另外一個(gè)Socket中,使這段信息能傳送到其他程序中。如圖2-1</p><p>  圖2-1 Socket工作原理圖  我們來(lái)分析一下圖2-1,Host A上的程序A將一段信息寫入Socket中,Socket的內(nèi)容被

45、Host A的網(wǎng)絡(luò)管理軟件訪問,并將這段信息通過Host A的網(wǎng)絡(luò)接口卡發(fā)送到Host B,Host B的網(wǎng)絡(luò)接口卡接收到這段信息后,傳送給Host B的網(wǎng)絡(luò)管理軟件,網(wǎng)絡(luò)管理軟件將這段信息保存在Host B的Socket中,然后程序B才能在Socket中閱讀這段信息。</p><p>  假設(shè)在圖2-1的網(wǎng)絡(luò)中添加第三個(gè)主機(jī)Host C,那么Host A怎么知道信息被正確傳送到Host B而不是被傳送到Host

46、 C中了呢?基于TCP/IP網(wǎng)絡(luò)中的每一個(gè)主機(jī)均被賦予了一個(gè)唯一的IP地址,IP地址是一個(gè)32位的無(wú)符號(hào)整數(shù),由于沒有轉(zhuǎn)變成二進(jìn)制,因此通常以小數(shù)點(diǎn)分隔,如:198.163.227.6,正如所見IP地址均由四個(gè)部分組成,每個(gè)部分的范圍都是0-255,以表示8位地址。</p><p>  值得注意的是IP地址都是32位地址,這是IP協(xié)議版本4(簡(jiǎn)稱Ipv4)規(guī)定的,目前由于IPv4地址已近耗盡,所以IPv6地址正逐

47、漸代替Ipv4地址,Ipv6地址則是128位無(wú)符號(hào)整數(shù)。</p><p>  假設(shè)第二個(gè)程序被加入圖2-1的網(wǎng)絡(luò)的Host B中,那么由Host A傳來(lái)的信息如何能被正確的傳給程序B而不是傳給新加入的程序呢?這是因?yàn)槊恳粋€(gè)基于TCP/IP網(wǎng)絡(luò)通訊的程序都被賦予了唯一的端口和端口號(hào),端口是一個(gè)信息緩沖區(qū),用于保留Socket中的輸入/輸出信息,端口號(hào)是一個(gè)16位無(wú)符號(hào)整數(shù),范圍是0-65535,以區(qū)別主機(jī)上的每一個(gè)

48、程序(端口號(hào)就像房屋中的房間號(hào)),低于256的短口號(hào)保留給標(biāo)準(zhǔn)應(yīng)用程序,比如pop3的端口號(hào)就是110,每一個(gè)套接字都組合進(jìn)了IP地址、端口、端口號(hào),這樣形成的整體就可以區(qū)別每一個(gè)套接字t,下面我們就來(lái)談?wù)剝煞N套接字:流套接字和自尋址數(shù)據(jù)套接字。</p><p>  流套接字(Stream Socket)</p><p>  無(wú)論何時(shí),在兩個(gè)網(wǎng)絡(luò)應(yīng)用程序之間發(fā)送和接收信息時(shí)都需要建立一個(gè)可

49、靠的連接,流套接字依靠TCP協(xié)議來(lái)保證信息正確到達(dá)目的地,實(shí)際上,IP包有可能在網(wǎng)絡(luò)中丟失或者在傳送過程中發(fā)生錯(cuò)誤,任何一種情況發(fā)生,作為接受方的 TCP將聯(lián)系發(fā)送方TCP重新發(fā)送這個(gè)IP包。這就是所謂的在兩個(gè)流套接字之間建立可靠的連接。</p><p>  流套接字在C/S程序中扮演一個(gè)必需的角色,客戶機(jī)程序(需要訪問某些服務(wù)的網(wǎng)絡(luò)應(yīng)用程序)創(chuàng)建一個(gè)扮演服務(wù)器程序的主機(jī)的IP地址和服務(wù)器程序(為客戶端應(yīng)用程序提

50、供服務(wù)的網(wǎng)絡(luò)應(yīng)用程序)的端口號(hào)的流套接字對(duì)象。</p><p>  客戶端流套接字的初始化代碼將IP地址和端口號(hào)傳遞給客戶端主機(jī)的網(wǎng)絡(luò)管理軟件,管理軟件將IP地址和端口號(hào)通過NIC傳遞給服務(wù)器端主機(jī);服務(wù)器端主機(jī)讀到經(jīng)過NIC傳遞來(lái)的數(shù)據(jù),然后查看服務(wù)器程序是否處于監(jiān)聽狀態(tài),這種監(jiān)聽依然是通過套接字和端口來(lái)進(jìn)行的;如果服務(wù)器程序處于監(jiān)聽狀態(tài),那么服務(wù)器端網(wǎng)絡(luò)管理軟件就向客戶機(jī)網(wǎng)絡(luò)管理軟件發(fā)出一個(gè)積極的響應(yīng)信號(hào),接

51、收到響應(yīng)信號(hào)后,客戶端流套接字初始化代碼就給客戶程序建立一個(gè)端口號(hào),并將這個(gè)端口號(hào)傳遞給服務(wù)器程序的套接字(服務(wù)器程序?qū)⑹褂眠@個(gè)端口號(hào)識(shí)別傳來(lái)的信息是否是屬于客戶程序)同時(shí)完成流套接字的初始化。</p><p>  如果服務(wù)器程序沒有處于監(jiān)聽狀態(tài),那么服務(wù)器端網(wǎng)絡(luò)管理軟件將給客戶端傳遞一個(gè)消極信號(hào),收到這個(gè)消極信號(hào)后,客戶程序的流套接字初始化代碼將拋出一個(gè)異常對(duì)象并且不建立通訊連接,也不創(chuàng)建流套接字對(duì)象。這種情形

52、就像打電話一樣,當(dāng)有人的時(shí)候通訊建立,否則電話將被掛起。</p><p>  這部分的工作包括了相關(guān)聯(lián)的三個(gè)類:InetAddress, Socket, 和 ServerSocket。 InetAddress對(duì)象描繪了32位或128位IP地址,Socket對(duì)象代表了客戶程序流套接字,ServerSocket代表了服務(wù)程序流套接字,所有這三個(gè)類均位于包java.net中。</p><p>&

53、lt;b>  Socket類</b></p><p>  當(dāng)客戶程序需要與服務(wù)器程序通訊的時(shí)候,客戶程序在客戶機(jī)創(chuàng)建一個(gè)socket對(duì)象,Socket類有幾個(gè)構(gòu)造函數(shù)。兩個(gè)常用的構(gòu)造函數(shù)是 Socket(InetAddress addr, int port) 和 Socket(String host, int port),兩個(gè)構(gòu)造函數(shù)都創(chuàng)建了一個(gè)基于Socket的連接服務(wù)器端流套接字的流套接字。

54、對(duì)于第一個(gè)InetAddress子類對(duì)象通過addr參數(shù)獲得服務(wù)器主機(jī)的IP地址,對(duì)于第二個(gè)函數(shù)host參數(shù)包被分配到InetAddress對(duì)象中,如果沒有IP地址與host參數(shù)相一致,那么將拋出UnknownHostException異常對(duì)象。兩個(gè)函數(shù)都通過參數(shù)port獲得服務(wù)器的端口號(hào)。假設(shè)已經(jīng)建立連接了,網(wǎng)絡(luò)API將在客戶端基于Socket的流套接字中捆綁客戶程序的IP地址和任意一個(gè)端口號(hào),否則兩個(gè)函數(shù)都會(huì)拋出一個(gè)IOExcept

55、ion對(duì)象。</p><p>  如果創(chuàng)建了一個(gè)Socket對(duì)象,那么它可能通過調(diào)用Socket的 getInputStream()方法從服務(wù)程序獲得輸入流讀傳送來(lái)的信息,也可能通過調(diào)用Socket的 getOutputStream()方法獲得輸出流來(lái)發(fā)送消息。在讀寫活動(dòng)完成之后,客戶程序調(diào)用close()方法關(guān)閉流和流套接字,下面的代碼創(chuàng)建了一個(gè)服務(wù)程序主機(jī)地址為198.163.227.6,端口號(hào)為13的Soc

56、ket對(duì)象,然后從這個(gè)新創(chuàng)建的Socket對(duì)象中讀取輸入流,然后再關(guān)閉流和Socket對(duì)象。</p><p>  Socket s = new Socket ("198.163.227.6", 13);InputStream is = s.getInputStream ();// Read from the stream.is.close ();s.close ();</p>

57、;<p>  Socket類包含了許多有用的方法。比如getLocalAddress()將返回一個(gè)包含客戶程序IP地址的InetAddress子類對(duì)象的引用;getLocalPort()將返回客戶程序的端口號(hào);getInetAddress()將返回一個(gè)包含服務(wù)器IP地址的InetAddress子類對(duì)象的引用;getPort()將返回服務(wù)程序的端口號(hào)。</p><p><b>  3 系統(tǒng)

58、分析</b></p><p>  3.1 系統(tǒng)可行性</p><p>  本系統(tǒng)的最終目的是實(shí)現(xiàn)一個(gè)簡(jiǎn)單的網(wǎng)絡(luò)棋牌室平臺(tái)包括兩塊內(nèi)容服務(wù)器和客戶端,可以進(jìn)行簡(jiǎn)單游戲和聊天功能??梢栽诳蛻舳嗽O(shè)計(jì)輸入要連接的服務(wù)器IP地址來(lái)創(chuàng)建連接,連接成功后則可創(chuàng)建游戲等待其他用戶的加入。其他用戶如連接到相同的服務(wù)器上時(shí)可以看見其他用戶可以選中用戶來(lái)加入其創(chuàng)建好的游戲?;镜膶?shí)現(xiàn)可以通過網(wǎng)絡(luò)通

59、信使用一個(gè)連接是Socket連接。Socket是在一個(gè)特定編程模型下,進(jìn)程間通信鏈路的端點(diǎn)。一個(gè)Socket包括兩個(gè)流:一個(gè)輸入流和一個(gè)輸出流。如果一個(gè)進(jìn)程要通過網(wǎng)絡(luò)想另一個(gè)進(jìn)程發(fā)送數(shù)據(jù),只需簡(jiǎn)單的寫入與Socket相關(guān)的輸出流。一個(gè)進(jìn)程通過從與Socket相關(guān)聯(lián)的輸入流來(lái)讀取另一個(gè)進(jìn)程所寫的數(shù)據(jù),從而可以實(shí)現(xiàn)客戶端通過Socket發(fā)送信息給服務(wù)器,服務(wù)器經(jīng)過處理返回給客戶端信息來(lái)實(shí)現(xiàn)通訊。</p><p>  

60、另外,通過Java中位于包java.net和javax.net中用于網(wǎng)絡(luò)的API來(lái)實(shí)現(xiàn)客戶端和服務(wù)器端的通訊。而在對(duì)程序界面上的設(shè)計(jì)也是調(diào)用各種API來(lái)實(shí)現(xiàn)這些類主要位于java.awt包中。</p><p>  3.2 系統(tǒng)應(yīng)達(dá)到的標(biāo)準(zhǔn)</p><p>  1、時(shí)間經(jīng)濟(jì)性:優(yōu)化邏輯設(shè)計(jì)與物理設(shè)計(jì),使系統(tǒng)運(yùn)行效率高,反映速度快。</p><p>  2、可靠性:能

61、準(zhǔn)確無(wú)誤地處理客戶端發(fā)送的命令,發(fā)送和接收數(shù)據(jù)。</p><p>  3、可理解性:低層的控制面板和聊天窗口界面使得用戶更方便使用該軟件。</p><p>  4、可維護(hù)性和適應(yīng)性:系統(tǒng)應(yīng)易于修改、易于擴(kuò)充、易于維護(hù),能夠適應(yīng)各種協(xié)議不斷變化的需要,而方便的做出更改。</p><p>  3.3 網(wǎng)絡(luò)棋牌游戲平臺(tái)工作原理</p><p> 

62、 1.網(wǎng)絡(luò)棋牌游戲平臺(tái)的工作方式是采用客戶/服務(wù)器模式??蛻舳撕头?wù)器使用TCP進(jìn)行連接,為建立連接,服務(wù)器都必須打開一個(gè)TCP端口。網(wǎng)絡(luò)棋牌室平臺(tái)服務(wù)器預(yù)置一個(gè)端口8000。</p><p>  java.net.Socket繼承于java.lang.Object,有八個(gè)構(gòu)造器,其方法并不多,下面是使用最頻繁的三個(gè)方法。</p><p>  Accept方法用于產(chǎn)生"阻塞&qu

63、ot;,直到接受到一個(gè)連接,并且返回一個(gè)客戶端的Socket對(duì)象實(shí)例。"阻塞"是一個(gè)術(shù)語(yǔ),它使程序運(yùn)行暫時(shí)"停留"在這個(gè)地方,直到一個(gè)會(huì)話產(chǎn)生,然后程序繼續(xù);通常"阻塞"是由循環(huán)產(chǎn)生的。</p><p>  getInputStream方法獲得網(wǎng)絡(luò)連接輸入,同時(shí)返回一個(gè)IutputStream對(duì)象實(shí)例。</p><p>  get

64、OutputStream方法連接的另一端將得到輸入,同時(shí)返回一個(gè)OutputStream對(duì)象實(shí)例。</p><p>  注意:其中g(shù)etInputStream和getOutputStream方法均會(huì)產(chǎn)生一個(gè)IOException,它必須被捕獲,因?yàn)樗鼈兎祷氐牧鲗?duì)象,通常都會(huì)被另一個(gè)流對(duì)象使用。</p><p>  2.如何開發(fā)一個(gè)Server-Client模型的程序</p>

65、<p><b>  開發(fā)原理:</b></p><p>  服務(wù)器,使用ServerSocket監(jiān)聽指定的端口,端口可以隨意指定(由于1024以下的端口通常屬于保留端口,在一些操作系統(tǒng)中不可以隨意使用,所以建議使用大于1024的端口),等待客戶連接請(qǐng)求,客戶連接后,會(huì)話產(chǎn)生;在完成會(huì)話后,關(guān)閉連接?! 】蛻舳?,使用Socket對(duì)網(wǎng)絡(luò)上某一個(gè)服務(wù)器的某一個(gè)端口發(fā)出連接請(qǐng)求,一旦連接

66、成功,打開會(huì)話;會(huì)話完成后,關(guān)閉Socket??蛻舳瞬恍枰付ù蜷_的端口,通常臨時(shí)的、動(dòng)態(tài)的分配一個(gè)1024以上的端口。</p><p>  在界面的操作上進(jìn)行actionPerformed、MouseListener、ActionListener來(lái)監(jiān)聽動(dòng)作的發(fā)生時(shí)間從而來(lái)控制游戲運(yùn)行和聊天實(shí)現(xiàn)。</p><p><b>  4 系統(tǒng)模塊設(shè)計(jì)</b></p&g

67、t;<p>  4.1 模塊組織圖 </p><p>  本系統(tǒng)包括以下幾個(gè)模塊:</p><p><b>  1.服務(wù)器框架模塊</b></p><p>  2.服務(wù)器信息顯示模塊</p><p><b>  3.服務(wù)器控制模塊</b></p><p>&l

68、t;b>  4.客戶端框架模塊</b></p><p><b>  5.游戲運(yùn)行模塊</b></p><p><b>  6.游戲控制模塊</b></p><p><b>  7.用戶聊天模塊</b></p><p><b>  8.用戶信息模塊&l

69、t;/b></p><p>  各模塊之間的組織關(guān)系如圖4-1</p><p>  圖4-1 模塊組織圖</p><p>  4.2 Socket流程圖</p><p>  客戶端與服務(wù)器端之間的數(shù)據(jù)交換socket流程圖4-2</p><p>  圖4-2 socket流程圖</p><p

70、>  4.3 模塊功能介紹</p><p><b>  1.服務(wù)器框架模塊</b></p><p>  服務(wù)器框架模塊的功能如下:</p><p>  管理各種服務(wù)器參數(shù);</p><p>  負(fù)責(zé)偵聽端口,開啟和關(guān)閉線程;</p><p>  提供狀態(tài)信息給界面模塊。</p>

71、<p>  2.服務(wù)器信息顯示模塊</p><p>  服務(wù)器信息顯示模塊的功能如下:</p><p>  顯示當(dāng)前用戶連接數(shù);</p><p>  顯示服務(wù)器信息包括IP地址端口號(hào);</p><p>  顯示用戶所有人模式下聊天的內(nèi)容。</p><p><b>  3.服務(wù)器控制模塊</

72、b></p><p>  服務(wù)器控制模塊的功能如下:</p><p>  清除當(dāng)先顯示的內(nèi)容;</p><p>  單擊按鍵可重新顯示服務(wù)器狀態(tài);</p><p>  關(guān)閉服務(wù)器按鍵設(shè)定;</p><p>  監(jiān)聽動(dòng)作事件從而進(jìn)行不同的處理。</p><p><b>  4.客戶

73、端框架模塊</b></p><p>  客戶端框架模塊的功能如下:</p><p><b>  布局棋盤規(guī)格;</b></p><p><b>  布局游戲控制面板;</b></p><p><b>  布局用戶面板;</b></p><p>

74、;<b>  布局聊天面板。</b></p><p><b>  5.游戲運(yùn)行模塊</b></p><p>  游戲運(yùn)行模塊的功能如下:</p><p><b>  棋盤的布局;</b></p><p>  當(dāng)前連接狀況、是否已經(jīng)創(chuàng)建游戲、游戲狀況等多種狀態(tài)信息的顯示;<

75、/p><p><b>  游戲規(guī)則的設(shè)定。</b></p><p><b>  6.游戲控制模塊</b></p><p>  游戲控制模塊的功能如下:</p><p><b>  IP地址輸入框;</b></p><p><b>  連接服務(wù)器按鍵

76、;</b></p><p><b>  創(chuàng)建游戲按鍵;</b></p><p><b>  加入游戲按鍵;</b></p><p><b>  放棄游戲按鍵;</b></p><p><b>  退出程序按鍵。</b></p>&

77、lt;p><b>  7.用戶聊天模塊</b></p><p>  用戶聊天模塊的功能如下:</p><p>  顯示用戶的所有人模式下的聊天內(nèi)容;</p><p>  顯示在私聊模式下的聊天內(nèi)容;</p><p><b>  聊天內(nèi)容輸入框。</b></p><p>

78、<b>  8.用戶信息模塊</b></p><p>  用戶信息模塊的功能如下:</p><p>  顯示當(dāng)前用戶的登入情況;</p><p>  獲得登入用戶的信息;</p><p>  提供可選擇進(jìn)行游戲的用戶。</p><p><b>  5 詳細(xì)設(shè)計(jì)</b><

79、;/p><p><b>  5.1 通信技術(shù)</b></p><p>  這一節(jié)我們將從理論上介紹各種功能在技術(shù)上的實(shí)現(xiàn),有了理論上的基礎(chǔ),在實(shí)際中的功能實(shí)現(xiàn)將會(huì)非常的簡(jiǎn)單,而具體的功能實(shí)現(xiàn)將在軟件界面及模塊分析兩節(jié)中具體分析。</p><p>  5.1.1 C/S模式</p><p>  C/S模式的基本思想是把集中

80、在一起的應(yīng)用劃分成功能不同的兩個(gè)部分,分別在不同的計(jì)算機(jī)上運(yùn)行,通過他們的分工合作來(lái)實(shí)現(xiàn)一個(gè)完整的功能。</p><p>  在這兩部分中,一個(gè)為服務(wù)器程序,用來(lái)響應(yīng)和提供固定的服務(wù);另一個(gè)為客戶機(jī)程序,用來(lái)向服務(wù)器提出請(qǐng)求和要求某種服務(wù)。</p><p>  從提供服務(wù)器所提供的類型可以分成重復(fù)型和并發(fā)型。我們這個(gè)某種程度上可以說是重復(fù)型。他通過以下步驟和客戶進(jìn)行交互:</p>

81、;<p>  1. 等待一個(gè)客戶的請(qǐng)求的到來(lái)</p><p><b>  2. 處理客戶請(qǐng)求</b></p><p>  3. 發(fā)送響應(yīng)給客戶</p><p><b>  4. 返回到第一步</b></p><p>  重復(fù)型服務(wù)器關(guān)鍵在第二步,此時(shí)服務(wù)器不能為其他客戶提供服務(wù)。<

82、;/p><p>  Java中的網(wǎng)絡(luò)編程</p><p>  事實(shí)上網(wǎng)絡(luò)編程簡(jiǎn)單的理解就是兩臺(tái)計(jì)算機(jī)相互通訊數(shù)據(jù)而已,對(duì)于程序員而言,去掌握一種編程接口并使用一種編程模型相對(duì)就會(huì)顯得簡(jiǎn)單的多了,Java SDK提供一些相對(duì)簡(jiǎn)單的API來(lái)完成這些工作。Socket就是其中之一,對(duì)于Java而言,這些API存在與java.net 這個(gè)包里面,因此只要導(dǎo)入這個(gè)包就可以準(zhǔn)備網(wǎng)絡(luò)編程了。</p&g

83、t;<p>  網(wǎng)絡(luò)編程的基本模型就是客戶機(jī)到服務(wù)器模型,簡(jiǎn)單的說就是兩個(gè)進(jìn)程之間相互通訊,然后其中一個(gè)必須提供一個(gè)固定的位置,而另一個(gè)則只需要知道這個(gè)固定的位置。并去建立兩者之間的聯(lián)系,然后完成數(shù)據(jù)的通訊就可以了,這里提供固定位置的通常稱為服務(wù)器,而建立聯(lián)系的通常叫做客戶端,基于這個(gè)簡(jiǎn)單的模型,就可以進(jìn)入網(wǎng)絡(luò)編程啦。</p><p>  Java對(duì)這個(gè)模型的支持有很多種API,而這里我只想介紹有關(guān)

84、Socket的編程接口,對(duì)于Java而言已經(jīng)簡(jiǎn)化了Socket的編程接口。首先我們來(lái)討論有關(guān)提供固定位置的服務(wù)方是如何建立的。Java提供了ServerSocket來(lái)對(duì)其進(jìn)行支持.事實(shí)上當(dāng)你創(chuàng)建該類的一個(gè)實(shí)力對(duì)象并提供一個(gè)端口資源你就建立了一個(gè)固定位置可以讓其他計(jì)算機(jī)來(lái)訪問你,ServerSocket server=new ServerSocket(6789);這里稍微要注意的是端口的分配必須是唯一的。因?yàn)槎丝谑菫榱宋ㄒ粯?biāo)識(shí)每臺(tái)計(jì)算機(jī)唯

85、一服務(wù)的,另外端口號(hào)是從0~65535之間的,前1024個(gè)端口已經(jīng)被Tcp/Ip 作為保留端口,因此你所分配的端口只能是1024個(gè)之后的。好了,我們有了固定位置.現(xiàn)在所需要的就是一根連接線了.該連接線由客戶方首先提出要求。因此Java同樣提供了一個(gè)Socket對(duì)象來(lái)對(duì)其進(jìn)行支持,只要客戶方創(chuàng)建一個(gè)Socket的實(shí)例對(duì)象進(jìn)行支持就可以了。</p><p>  5.1.3 Java在Client/Server 網(wǎng)絡(luò)

86、中的應(yīng)用</p><p>  隨著Java語(yǔ)言的日益流行,特別是Java與Internet Web的密切結(jié)合,使它在全球取得了巨大的成功。Java語(yǔ)言以其獨(dú)立于平臺(tái)、面向?qū)ο?、分布式、多線索及完善的安全機(jī)制等特色,成為現(xiàn)代信息系統(tǒng)建設(shè)中的良好的開發(fā)平臺(tái)和運(yùn)行環(huán)境。</p><p>  Java網(wǎng)絡(luò)應(yīng)用模型 </p><p>  和Internet上的許多環(huán)境一樣,完

87、整的Java應(yīng)用環(huán)境實(shí)際上也是一個(gè)客戶機(jī)/服務(wù)器環(huán)境,更確切地說是瀏覽器/服務(wù)器模型(即Browser/Server模型,簡(jiǎn)稱Web模型)。但與傳統(tǒng)的客戶機(jī)/服務(wù)器(C/S) 的二層結(jié)構(gòu)不同,應(yīng)用Java的Web模型是由三層結(jié)構(gòu)組成的。傳統(tǒng)的C/S結(jié)構(gòu)通過消息傳遞機(jī)制,由客戶端發(fā)出請(qǐng)求給服務(wù)器,服務(wù)器進(jìn)行相應(yīng)處理后經(jīng)傳遞機(jī)制送回客戶端。而在Web模型中,服務(wù)器一端被分解成兩部分:一部分是應(yīng)用服務(wù)器(Web 服務(wù)器),另一部分是數(shù)據(jù)庫(kù)服務(wù)

88、器。</p><p>  針對(duì)分布式計(jì)算環(huán)境,Java通過其網(wǎng)絡(luò)類庫(kù)提供了良好的支持。對(duì)數(shù)據(jù)分布,Java提供了一個(gè)URL(Uniform Resource Locator) 對(duì)象, 利用此對(duì)象可打開并訪問網(wǎng)絡(luò)上的對(duì)象,其訪問方式與訪問本地文件系統(tǒng)幾乎完全相同。對(duì)操作分布,Java的客戶機(jī)/ 服務(wù)器模式可以把運(yùn)算從服務(wù)器分散到客戶一端(服務(wù)器負(fù)責(zé)提供查詢結(jié)果,客戶機(jī)負(fù)責(zé)組織結(jié)果的顯示),從而提高整個(gè)系統(tǒng)的執(zhí)行效率

89、,增加動(dòng)態(tài)可擴(kuò)充性。Java網(wǎng)絡(luò)類庫(kù)是Java 語(yǔ)言為適應(yīng)Internet 環(huán)境而進(jìn)行的擴(kuò)展。另外,為適應(yīng)Internet的不斷發(fā)展,Java還提供了動(dòng)態(tài)擴(kuò)充協(xié)議,以不斷擴(kuò)充Java網(wǎng)絡(luò)類庫(kù)。 </p><p>  Java的網(wǎng)絡(luò)類庫(kù)支持多種Internet協(xié)議,包括Telnet, FTP 和HTTP (WWW),與此相對(duì)應(yīng)的Java網(wǎng)絡(luò)類庫(kù)的子類庫(kù)為:</p><p>  Java.ne

90、t    Java.net.ftp    Java.net.www.content    Java.net.www.html    Java.net.www.http   這些子類庫(kù)各自容納了可用于處理Internet協(xié)議的類和方法。其中,java.net用于處理一些基本的網(wǎng)絡(luò)功能,包括遠(yuǎn)程登錄(Telnet);java.net.ftp用于處理ftp協(xié)議;java.net.www.content用于處理WWW 頁(yè)面內(nèi)容;jav

91、a.net.www.html 和java.net.www.http 則分別提供了對(duì)HTML 語(yǔ)言和HTTP 協(xié)議的支持。</p><p>  客戶機(jī)/服務(wù)器環(huán)境下的Java應(yīng)用程序</p><p>  客戶機(jī)/服務(wù)器在分布處理過程中,使用基于連接的網(wǎng)絡(luò)通信模式。該通信模式首先在客戶機(jī)和服務(wù)器之間定義一套通信協(xié)議,并創(chuàng)建一Socket類,利用這個(gè)類建立一條可靠的鏈接;然后,客戶機(jī)/服務(wù)器再在

92、這條鏈接上可靠地傳輸數(shù)據(jù)??蛻魴C(jī)發(fā)出請(qǐng)求,服務(wù)器監(jiān)聽來(lái)自客戶機(jī)的請(qǐng)求,并為客戶機(jī)提供響應(yīng)服務(wù)。這就是典型的"請(qǐng)求-- 應(yīng)答" 模式。下面是客戶機(jī)/服務(wù)器的一個(gè)典型運(yùn)作過程:   1、服務(wù)器監(jiān)聽相應(yīng)端口的輸入;   2、客戶機(jī)發(fā)出一個(gè)請(qǐng)求;   3、服務(wù)器接收到此請(qǐng)求;   4、服務(wù)器處理這個(gè)請(qǐng)求,并把結(jié)果返回給客戶機(jī);   5、重復(fù)上述過程,直至完成一次會(huì)話過程。   按照以上過程,我們使用Java語(yǔ)言編

93、寫一個(gè)分別針對(duì)服務(wù)器和客戶機(jī)的應(yīng)用程序(Application)。該程序在服務(wù)器上時(shí),程序負(fù)責(zé)監(jiān)聽客戶機(jī)請(qǐng)求,為每個(gè)客戶機(jī)請(qǐng)求建立Socket 連接,從而為客戶機(jī)提供服務(wù)。本程序提供的服務(wù)為:讀取來(lái)自客戶機(jī)的一行文本,反轉(zhuǎn)該文本,并把它發(fā)回給客戶機(jī)。   通過該程序?qū)嵗覀兛吹?,使用Java語(yǔ)言設(shè)計(jì)C/S程序時(shí)需要注意以下幾點(diǎn):  ?。?)、 服務(wù)器應(yīng)使用ServerSocket 類</p><p>  5.

94、1.4 Java套接字編程主要類和函數(shù)</p><p>  InetAddress類在網(wǎng)絡(luò)API套接字編程中扮演了一個(gè)重要角色。參數(shù)傳遞給流套接字類和自尋址套接字類構(gòu)造器或非構(gòu)造器方法。InetAddress描述了32位或64位IP地址,要完成這個(gè)功能,InetAddress類主要依靠?jī)蓚€(gè)支持類Inet4Address 和 Inet6Address,這三個(gè)類是繼承關(guān)系,InetAddress是父類,Inet4A

95、ddress 和 Inet6Address是子類。</p><p>  由于InetAddress類只有一個(gè)構(gòu)造函數(shù),而且不能傳遞參數(shù),所以不能直接創(chuàng)建InetAddress對(duì)象,比如下面的做法就是錯(cuò)誤的:</p><p>  InetAddress ia = new InetAddress ();  但我們可以通過下面的5個(gè)工廠方法創(chuàng)建來(lái)創(chuàng)建一個(gè)InetAddress對(duì)象或InetAd

96、dress數(shù)組:</p><p>  getAllByName(String host)方法返回一個(gè)InetAddress對(duì)象的引用,每個(gè)對(duì)象包含一個(gè)表示相應(yīng)主機(jī)名的單獨(dú)的IP地址,這個(gè)IP地址是通過host參數(shù)傳遞的,對(duì)于指定的主機(jī)如果沒有IP地址存在那么這個(gè)方法將拋出一個(gè)UnknownHostException 異常對(duì)象。</p><p>  getByAddress(byte []

97、addr)方法返回一個(gè)InetAddress對(duì)象的引用,這個(gè)對(duì)象包含了一個(gè)Ipv4地址或Ipv6地址,Ipv4地址是一個(gè)4字節(jié)數(shù)組,Ipv6地址是一個(gè)16字節(jié)地址數(shù)組,如果返回的數(shù)組既不是4字節(jié)的也不是16字節(jié)的,那么方法將會(huì)拋出一個(gè)UnknownHostException異常對(duì)象。</p><p>  getByAddress(String host, byte [] addr)方法返回一個(gè)InetAddres

98、s對(duì)象的引用,這個(gè)InetAddress對(duì)象包含了一個(gè)由host和4字節(jié)的addr數(shù)組指定的IP地址,或者是host和16字節(jié)的addr數(shù)組指定的IP地址,如果這個(gè)數(shù)組既不是4字節(jié)的也不是16位字節(jié)的,那么該方法將拋出一個(gè)UnknownHostException異常對(duì)象。</p><p>  getByName(String host)方法返回一個(gè)InetAddress對(duì)象,該對(duì)象包含了一個(gè)與host參數(shù)指定的主

99、機(jī)相對(duì)應(yīng)的IP地址,對(duì)于指定的主機(jī)如果沒有IP地址存在,那么方法將拋出一個(gè)UnknownHostException異常對(duì)象。</p><p>  getLocalHost()方法返回一個(gè)InetAddress對(duì)象,這個(gè)對(duì)象包含了本地機(jī)的IP地址,考慮到本地主機(jī)既是客戶程序主機(jī)又是服務(wù)器程序主機(jī),為避免混亂,我們將客戶程序主機(jī)稱為客戶主機(jī),將服務(wù)器程序主機(jī)稱為服務(wù)器主機(jī)。</p><p> 

100、 上面講到的方法均提到返回一個(gè)或多個(gè)InetAddress對(duì)象的引用,實(shí)際上每一個(gè)方法都要返回一個(gè)或多個(gè)Inet4Address/Inet6Address對(duì)象的引用,調(diào)用者不需要知道引用的子類型,相反調(diào)用者可以使用返回的引用調(diào)用InetAddress對(duì)象的非靜態(tài)方法,包括子類型的多態(tài)以確保重載方法被調(diào)用?! netAddress和它的子類型對(duì)象處理主機(jī)名到主機(jī)IPv4或IPv6地址的轉(zhuǎn)換,要完成這個(gè)轉(zhuǎn)換需要使用域名系統(tǒng),下面的代碼

101、示范了如何通過調(diào)用getByName(String host)方法獲得InetAddress子類對(duì)象的方法,這個(gè)對(duì)象包含了與host參數(shù)相對(duì)應(yīng)的IP地址:</p><p>  InetAddress ia = InetAddress.getByName ("www.javajeff.com"));  一但獲得了InetAddress子類對(duì)象的引用就可以調(diào)用InetAddress的各種方法來(lái)獲

102、得InetAddress子類對(duì)象中的IP地址信息,比如,可以通過調(diào)用getCanonicalHostName()從域名服務(wù)中獲得標(biāo)準(zhǔn)的主機(jī)名;getHostAddress()獲得IP地址,getHostName()獲得主機(jī)名,isLoopbackAddress()判斷IP地址是否是一個(gè)loopback地址。</p><p>  WINSOCK API 包括很多函數(shù),但其中最常用的有:</p><

103、;p>  1、WSAStartup():連結(jié)應(yīng)用程序與 Windows Sockets DLL 的第一個(gè)函數(shù)。</p><p>  說明: 此函數(shù)是應(yīng)用程序調(diào)用 Windows Sockets DLL函數(shù)中的第一個(gè),也唯有此函數(shù)呼叫成功後,才可以再調(diào)用其他 Windows Sockets DLL 的函數(shù)。</p><p>  2、WSACleanup():結(jié)束 Windows Soc

104、kets DLL 的使用。</p><p>  說明: 當(dāng)應(yīng)用程序不再需要使用 Windows Sockets DLL時(shí),須調(diào)用此函數(shù)來(lái)注銷使用,以便釋放其占用的資源。</p><p>  3、 socket():建立Socket。</p><p>  說明: 此函數(shù)用來(lái)建立一 Socket 描述字,并為此 Socket 建立其所使用的資源。</p>

105、<p>  4、 closesocket():關(guān)閉某一Socket。</p><p>  說明: 此一函數(shù)是用來(lái)關(guān)閉某一 Socket。</p><p>  5、 bind():將一本地地址與一個(gè)SOCKET描述字連接在一起。 說明:此函數(shù)在服務(wù)程序上使用,是調(diào)用監(jiān)聽函數(shù)listen()必須要調(diào)用的函數(shù)。</p><p>  6、 listen():設(shè)定

106、Socket 為監(jiān)聽狀態(tài),準(zhǔn)備被連接。</p><p>  說明: 此函數(shù)在服務(wù)程序上使用,來(lái)設(shè)定 Socket 進(jìn)入監(jiān)聽狀態(tài),并設(shè)定最多可有多少個(gè)在未真正完成連接前的客戶端的連接要求。(目前最大值限制為 5, 最</p><p><b>  小值為1)</b></p><p>  7、 accept():接受某一Socket的連接要求,以完成

107、面向連接的客戶端 Socket 的連接請(qǐng)求。</p><p>  說明: 服務(wù)端應(yīng)用程序調(diào)用此函數(shù)來(lái)接受客戶端Socket 連接請(qǐng)求,accept() 函數(shù)的返回值為一新的 Socket,新 Socket 就可用來(lái)在服務(wù)端和客戶端之間的信息傳遞接收,而原來(lái) Socket 仍然可以接收其他客戶端的連接要求。</p><p>  8、 connect():要求連接某一Socket到指定的網(wǎng)絡(luò)上

108、服務(wù)端。</p><p>  說明: 此函數(shù)用在客戶端,用來(lái)向服務(wù)端要求建立連接。當(dāng)連接建立完成後,客戶端即可利用此 Socket 來(lái)與服務(wù)端進(jìn)行信息傳遞。</p><p>  9、 receive():從面向連接的 Socket 接收信息。</p><p>  說明: 此函數(shù)用來(lái)從面向連接的 Socket 接收信息。</p><p>  1

109、0、send():使用面向連接的 Socket 發(fā)送信息。</p><p>  說明: 此函數(shù)用來(lái)從面向連接的 Socket 發(fā)送信息。</p><p>  5.1.5 套接字編程的系統(tǒng)流程</p><p>  對(duì)于面向連接的套接字,服務(wù)器端啟動(dòng)后首先要調(diào)用socket()函數(shù)建立一個(gè)流式套接字,并返回引用新套接字的描述符。之后,將此套接字描述符與本機(jī)的一個(gè)端口建

110、立關(guān)聯(lián),這由bind()函數(shù)來(lái)完成。繼續(xù)調(diào)用Listen()函數(shù)將套接字置于被動(dòng)的偵聽方式以監(jiān)聽連接,并確定能夠同時(shí)處理的客戶請(qǐng)求數(shù)目。服務(wù)器只有在調(diào)用了accept()函數(shù)進(jìn)入等待狀態(tài)之后才可以接受來(lái)自客戶端的請(qǐng)求。一旦接收到客戶端通過connect()發(fā)出的連接請(qǐng)求,accept()將返回一個(gè)新的套接字描述符,通過此套接字即可與客戶端進(jìn)行數(shù)據(jù)收發(fā)。待數(shù)據(jù)傳送完成,服務(wù)器、客戶端調(diào)用closesocket()關(guān)閉套接字。需要說明的是服

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ù)僅提供信息存儲(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)論