版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p> 學(xué)號: 0928524059</p><p> 基于Mina框架的Java通訊層應(yīng)用</p><p> 學(xué)院名稱: 軟件學(xué)院 </p><p> 專業(yè)名稱: 計算機(jī)科學(xué)與技術(shù) </p><p> 年級班別: 2009級Java班 </p><p&g
2、t; 姓 名: </p><p> 指導(dǎo)教師: 教授 </p><p><b> 2013年05月</b></p><p> 基于Mina框架的Java通訊層應(yīng)用</p><p> 摘 要 Apache Mina Server是
3、一個網(wǎng)絡(luò)通信應(yīng)用框架,它主要是對基于TCP/IP、UDP/IP協(xié)議棧的通信框架(當(dāng)然,也可以提供JAVA對象的序列化服務(wù)、虛擬機(jī)管道通信服務(wù)等),Mina 可以幫助我們快速開發(fā)高性能、高擴(kuò)展性的網(wǎng)絡(luò)通信應(yīng)用,Mina 提供了事件驅(qū)動、異步(Mina 的異步IO 默認(rèn)使用的是JAVA NIO 作為底層支持)操作的編程模型。隨著網(wǎng)絡(luò)通信的不斷增加,用戶對于服務(wù)器通訊層的要求也越來越高。如何提高服務(wù)器端程序的性能,如何使用一種高效的I/O底層
4、,從而更容易地開發(fā)出高性能的網(wǎng)絡(luò)應(yīng)用程序,成為近年來通訊層研究的主要課題。通過對比,基于Mhm(Minimum hardware modificatio)框架的通訊層具有實現(xiàn)簡單,性能高效的特點,是Java通訊層應(yīng)用的推薦框架.</p><p> 關(guān)鍵詞 Mina;Java; Mhm;IO;NIO;Socket;ServerSocket; TCP/IP; IoAcceptor ;IoConnector; Bu
5、fferedReader;Buffer;Charset;Channels;Selector;J2EE;MyEclipse;Enterprise ;JavaBeans; MinaServe</p><p> Based on the the Mina Framework of Java Communication Layer Applications</p><p> Abstract
6、 Apache Mina Server is a network communication application framework, it is primarily a communication framework based on TCP / IP, UDP / IP protocol stack (of course, also can provide Java object serialization, the virtu
7、al machine pipe communication services), Mina canhelp us to quickly develop high-performance, highly scalable network communications applications, Mina provides event-driven, asynchronous (asynchronous IO Mina's defa
8、ult is to use programming model the Java NIO as the und</p><p> Keywords Mina;Java; Mhm;IO;NIO;Socket;ServerSocket; TCP/IP; IoAcceptor ;IoConnector; BufferedReader;Buffer;Charset;Channels;Selector;J2EE;MyEc
9、lipse;Enterprise ;JavaBeans; MinaServe。</p><p><b> 目 錄</b></p><p><b> 前 言4</b></p><p> 1運(yùn)用socket實現(xiàn)通信的方式與關(guān)鍵技術(shù)4</p><p> 1.1 通過JAVA的Socket阻
10、塞方式實現(xiàn)通信4</p><p> 1.1.1 阻塞通信的服務(wù)器端4</p><p> 1.1.2 阻塞通信的客戶端4</p><p> 1.2 通過JAVA的Socket非阻塞方式實現(xiàn)通信錯誤!未定義書簽。</p><p> 1.3 TCP/IP協(xié)議5</p><p> 1.3.1 Tcp、Ip
11、協(xié)議的特點5</p><p> 1.3.2 Tcp/Ip數(shù)據(jù)的傳輸過程5</p><p> 1.3.3 端口號6</p><p> 1.4 MINA 架構(gòu)剖析6</p><p> 2.nio和io的區(qū)別和比較7</p><p><b> 2.1回顧IO7</b></p
12、><p> 2.2 NIO的介紹和新I/O9</p><p> 2.2.1介紹NIO9</p><p> 2.2.2 新I/O10</p><p> 3.程序設(shè)計與編碼11</p><p> 3.1開發(fā)平臺與工具11</p><p> 3.1.1 J2EE平臺11</p
13、><p> 3.1.2 集成環(huán)境11</p><p> 3.2具體代碼實現(xiàn)步驟11</p><p> 3.2.1下載使用的Jar包11</p><p> 3.2.2工程創(chuàng)建配置12</p><p> 3.2.3.服務(wù)端程序12</p><p> 3.2.4.客戶端程序16&l
14、t;/p><p> 4.系統(tǒng)說明書19</p><p> 4.1開發(fā)環(huán)境及工具19</p><p> 4.2本聊天室包括服務(wù)器和客戶端兩個部分:19</p><p> 4.3具體的使用說明如下:19</p><p><b> 參考文獻(xiàn)20</b></p><p&
15、gt;<b> 致 謝20</b></p><p><b> 前 言</b></p><p> 自進(jìn)入21世紀(jì)以來,網(wǎng)絡(luò)發(fā)展異常迅速,電腦走進(jìn)了普通人的家中,成了我們生活中不可缺少的一部分,隨著用戶的激增,網(wǎng)絡(luò)通信的不斷增加,用戶對于服務(wù)器通訊層的要求也越來越高,給現(xiàn)在的服務(wù)器端的正常運(yùn)行帶來了很大的壓力。因此,如何提高服務(wù)器端程序
16、的性能,如何使用一種高效的I/O底層,從而更容易地開發(fā)出高性能的網(wǎng)絡(luò)通信程序,成為近年來通訊層研究的主要課題。本論文通過JAVA的Socket非阻塞方式實現(xiàn)了一個局域網(wǎng)的通信。目前Java構(gòu)建的網(wǎng)絡(luò)應(yīng)用程序框架有多種,較為流行的框架有Grizzly、Netty、QuickServer、xSocket、Mina等,通過對比,基于Mina框架的通訊層具有實現(xiàn)簡單,性能高效的特點[1],是Java通訊層應(yīng)用的推薦框架。</p>
17、<p> 1運(yùn)用socket實現(xiàn)通信的方式與關(guān)鍵技術(shù)</p><p> 1.1 通過JAVA的Socket非阻塞方式實現(xiàn)通信[2]</p><p> 非阻塞式通訊是指可以將通信操作交給特定的通信硬件去完成,而無需等</p><p> 到其完全完成便可以返回。在該通信硬件進(jìn)行通信操作時,處理機(jī)可以同步進(jìn)</p><p> 行
18、計算操作,實現(xiàn)了計算與通信的重疊,從而提高整個程序的執(zhí)行效率。但缺點</p><p><b> 是不易實現(xiàn)。</b></p><p> 1.2 通過JAVA的Socket阻塞方式實現(xiàn)通信</p><p> 阻塞式通訊是指在每建立一個Socket連接的同時,創(chuàng)建一個新線程對該</p><p> Socket避行單獨(dú)
19、通信[3][4]。這種方式編碼簡單,實現(xiàn)容易,對一定數(shù)量的連接性能比</p><p> 較好。但是如果客戶端上限很大的情況下,就不能得到及時的響應(yīng),且對系統(tǒng)資</p><p><b> 源是一種浪費(fèi)。</b></p><p> 1.2.1 阻塞通信的服務(wù)器端</p><p> 服務(wù)器,使用ServerSocket
20、監(jiān)聽指定的端口,端口可以隨意指定(由于1024以下的端口通常屬于保留端口,在一些操作系統(tǒng)中不可以隨意使用,所以建議使用大于1024的端口),等待客戶連接請求,客戶連接后,會話產(chǎn)生;在完成會話后,關(guān)閉連接。</p><p> 1.2.2 阻塞通信的客戶端</p><p> 客戶端,使用socket通信對網(wǎng)絡(luò)上某一個服務(wù)器的某一個端口發(fā)出連接請求,一旦連接成功,打開會話;會話完成后,關(guān)閉S
21、ocket??蛻舳瞬恍枰付ù蜷_的端口,通常臨時的、動態(tài)的分配一個1024以上的端口。</p><p> 1.3 TCP/IP協(xié)議</p><p> 1.3.1 Tcp、Ip協(xié)議的特點</p><p> TCP/IP(Transmission Control Protocol/Internet Protocol)協(xié)議不是TCP和IP這兩個協(xié)議的合稱,而是指因
22、特網(wǎng)整個TCP/IP協(xié)議族。</p><p> 從協(xié)議分層模型方面來講,TCP/IP由四個層次組成:網(wǎng)絡(luò)接口層、網(wǎng)絡(luò)層、傳輸層、應(yīng)用層[5]。</p><p> 圖一: TCP/IP四層協(xié)議的表示方法舉例</p><p> IP協(xié)議的作用:第一,它是網(wǎng)絡(luò)層的協(xié)議,提供互聯(lián)網(wǎng)上數(shù)據(jù)傳輸?shù)慕y(tǒng)一格式。第二,提供不可靠的無連接的服務(wù)。第三,定義了互聯(lián)網(wǎng)上的傳輸數(shù)據(jù)的基
23、本單元,提供了供路由選擇的信息,沒有差錯校驗和處理的機(jī)制。</p><p> TCP協(xié)議的功能:差錯控制——可靠性、面向連接、分段(Segment)、端口號。TCP是傳輸控制協(xié)議,是面向連接的提供了一種可靠的傳輸服務(wù),它用三次握手和滑動窗口機(jī)制來保證傳輸?shù)目煽啃?,及進(jìn)行流量控制。</p><p> 1.3.2 Tcp/Ip數(shù)據(jù)的傳輸過程</p><p> 當(dāng)你
24、把要傳送的數(shù)據(jù)傳遞給TCP后,TCP把這些信息分成很多個數(shù)據(jù)包(這種數(shù)據(jù)包稱為TCP分組),每一個分組都包含有一個序號。</p><p> 接著TCP分組被傳遞給IP層,IP層把這個TCP分組放在一個IP數(shù)據(jù)包的數(shù)據(jù)部分。然后,這個IP數(shù)據(jù)包被傳到目的主機(jī)。目的主機(jī)上的IP層,把IP數(shù)據(jù)包的數(shù)據(jù)部分(即TCP分組)傳遞給TCP層。TCP接收到分組后,檢查數(shù)據(jù)包的正確性,如果不正確,通知源計算機(jī)重新送該IP包。利
25、用分組的序號來將數(shù)據(jù)按照原來的順序排列,然后送給應(yīng)用層。</p><p><b> 1.3.3 端口號</b></p><p> 邏輯意義上的端口,一般是指TCP/IP協(xié)議中的端口[6],端口號的范圍從0到65535,比如用于瀏覽網(wǎng)頁服務(wù)的80端口,用于FTP服務(wù)的21端口等等。 </p><p> 服務(wù)器一般都是通過知名端口號來識別的。
26、例如,對于每個TCP/IP實現(xiàn)來說,F(xiàn)TP服務(wù)器的TCP端口號都是21,每個Telnet服務(wù)器的TCP端口號都是23,每個TFTP(簡單文件傳送協(xié)議)服務(wù)器的UDP端口號都是69。任何TCP/IP實現(xiàn)所提供的服務(wù)都用知名的1~1023之間的端口號。這些知名端口號由Internet號分配機(jī)構(gòu)(Internet Assigned Numbers Authority,IANA)來管理。 </p><p> 1.4
27、MINA 架構(gòu)剖析</p><p> MINA (Multipurpose Infrastructure for Network Applications)是Apache 軟件組織開發(fā)的一種作為基于NIO的一個多功能網(wǎng)絡(luò)應(yīng)用程序框架,使用Java 技術(shù)實現(xiàn),可以幫助用戶快速構(gòu)建穩(wěn)定、高性能的網(wǎng)絡(luò)應(yīng)用程序。該框架的主要特點有:基于Java NIO設(shè)計。巧妙地采用松耦合架構(gòu);可靈活地加載過濾器機(jī)制;單元測試更容易實
28、現(xiàn);可自定義線程的數(shù)量,以提高運(yùn)行于多處理器上的性能 采用回調(diào)的方式完成調(diào)用.線程的使用更容易[7]。通過Java 異步輸入輸出(NIO)[8]技術(shù),可以方便的支持TCP/UDP 協(xié)議;靈活、可配置的線程模型,這對于網(wǎng)絡(luò)通信程序來說尤其重要, 用戶可以根據(jù)實際需要選擇符合自身的線程模型;多編碼方式支持,既可以使用字節(jié)流或者文本,也可以使用其它編碼方式,如ASN.1 編碼等。MINA 框架的系統(tǒng)結(jié)構(gòu)如圖二 所示。</p>&
29、lt;p> 圖二:MINA系統(tǒng)機(jī)構(gòu)示意圖</p><p> MINA 框架主要由I/O 服務(wù)管理(IoService)、I/O 過濾器鏈(IoFilterChain)、I/O 處理器(IoHandler)和I/O 會話管理(IoSession)等模塊組成。IoService 負(fù)責(zé)與遠(yuǎn)端客戶進(jìn)行通信底層操作,遠(yuǎn)端發(fā)送的數(shù)據(jù)首先由IoService 接收并轉(zhuǎn)化為系統(tǒng)內(nèi)部可識別的事件, 它的兩個實現(xiàn)類IoAc
30、ceptor 和IoConnector 分別對應(yīng)服務(wù)器端和客戶端的I/O 服務(wù)管理類; 然后,IoFilterChain 接收由IoService 轉(zhuǎn)化的事件,并使用鏈中包含的過濾器(IoFilter)進(jìn)行處理,如日志記錄、編碼/解碼、壓縮和黑名單過濾等;最后,IoHandler負(fù)責(zé)處理由過濾器鏈處理后的事件, 業(yè)務(wù)邏輯大多在本模塊中實現(xiàn)。處理完后,由IoSession 負(fù)責(zé)與遠(yuǎn)端客戶進(jìn)行交互,即使用IoSession 向遠(yuǎn)端發(fā)送的消息
31、,該消息的發(fā)送順序與接收的處理順序剛好相反[9](如圖二)。</p><p> Mina提供了時間驅(qū)動和異步操作的編程模型。當(dāng)前發(fā)行的Mhm版本支持基于Java NIO技術(shù)的TCP/UDP應(yīng)用程序開發(fā)、串口通訊程序,且Mina所支持的功能也在進(jìn)一步的擴(kuò)展中。因此,在Java應(yīng)用程序中使用Mhm框架可以不用考慮底層I/0實現(xiàn)以及線程并發(fā)等復(fù)雜工作,使開發(fā)人員能夠?qū)⒏嗟木ν度氲綐I(yè)務(wù)邏輯和開發(fā)中,故被廣泛采用[1
32、0]。</p><p> 2.nio和io的區(qū)別和比較</p><p><b> 2.1回顧IO</b></p><p> 在介紹NIO之前,有必要了解傳統(tǒng)的I/O操作的方式。以網(wǎng)絡(luò)應(yīng)用為例,傳統(tǒng)方式需要監(jiān)聽一個ServerSocket,接受請求的連接為其提供服務(wù)(服務(wù)通常包括了處理請求并發(fā)送響應(yīng))圖一是服務(wù)器的生命周期圖,其中標(biāo)有粗黑線
33、條的部分表明會發(fā)生I/O阻塞。</p><p><b> 圖三</b></p><p> 可以分析創(chuàng)建服務(wù)器的每個具體步驟。</p><p> ?。?)首先創(chuàng)建ServerSocketServerSocket server=new ServerSocket(10000);(2)然后接受新的連接請求 Socket newConnecti
34、on=server.accept(); 對于accept方法的調(diào)用將造成阻塞,直到ServerSocket接受到一個連接請求為止。一旦連接請求被接受,服務(wù)器可以讀客戶socket中的請求。InputStream in = newConnection.getInputStream();InputStreamReader reader = new InputStreamReader(in);BufferedReader buf
35、fer = new BufferedReader(reader);Request request = new Request();while(!request.isComplete()) {String line = buffer.readLine();request.addLine(line);}</p><p> 這樣的操作有兩個問題,首先BufferedReader類的readLine()方法在
36、其緩沖區(qū)未滿時會造成線程阻塞,只有一定數(shù)據(jù)填滿了緩沖區(qū)或者客戶關(guān)閉了套接字,方法才會返回。其次,它回產(chǎn)生大量的垃圾,BufferedReader創(chuàng)建了緩沖區(qū)來從客戶套接字讀入數(shù)據(jù),但是同樣創(chuàng)建了一些字符串存儲這些數(shù)據(jù)。雖然BufferedReader內(nèi)部提供了StringBuffer處理這一問題,但是所有的String很快變成了垃圾需要回收。同樣的問題在發(fā)送響應(yīng)代碼中也存在:Response response = request.ge
37、nerateResponse();OutputStream out = newConnection.getOutputStream();InputStream in = response.getInputStream();int ch;while(-1 != (ch = in.read())) {out.write(ch);}newConnection.close();</p><p> 類似的,
38、讀寫操作被阻塞而且向流中一次寫入一個字符會造成效率低下,所以應(yīng)該使用緩沖區(qū),但是一旦使用緩沖,流又會產(chǎn)生更多的垃圾。傳統(tǒng)的解決方法通常在Java中處理阻塞I/O要用到線程(大量的線程(Thread))。一般是實現(xiàn)一個線程池用來處理請求,</p><p><b> 如圖四:</b></p><p> 圖四 線程使得服務(wù)器可以處理多個連接,但是它們也同樣引發(fā)了
39、許多問題。每個線程擁有自己的??臻g并且占用一些CPU時間,耗費(fèi)很大,而且很多時間是浪費(fèi)在阻塞的I/O操作</p><p> 上,沒有有效的利用CPU。</p><p> 2.2 NIO的介紹和新I/O</p><p> 2.2.1介紹NIO</p><p> Java具有安全性、簡易性、健壯性以及平臺無關(guān)性等特點,但用Java平臺編
40、</p><p> 寫的Socket系統(tǒng),在多客戶端/服務(wù)器模式下,易受到大置線程開銷的影響,這</p><p> 樣既導(dǎo)致了性能問題又缺乏可伸縮性。為解決這個問題,Java平臺的制訂者引</p><p> 入了非阻塞I/O機(jī)制[11]。</p><p> NIO的非阻塞I/O機(jī)制的核心思想是多路復(fù)用,即將事物多路分離并分派</
41、p><p> 到各自相應(yīng)的事件處理程序中去.它主要是圍繞選擇器和通道構(gòu)建的[12]。由于</p><p> NIO的非阻塞I/O機(jī)制有效地解決了多線程服務(wù)器存在的線程開銷問題,同時</p><p> 又避免了輪詢問題.在性能上優(yōu)于傳統(tǒng)的阻塞式通訊,因此被廣泛的大型的</p><p> Java應(yīng)用程序所采用。</p><
42、;p> NIO包(java.nio.*)引入了四個關(guān)鍵的抽象數(shù)據(jù)類型,它們共同解決傳統(tǒng)的I/O類中的一些問題。</p><p> Buffer:它是包含數(shù)據(jù)且用于讀寫的線形表結(jié)構(gòu)。其中還提供了一個特殊類用于內(nèi)存映射文件的I/O操作。</p><p> Charset:它提供Unicode字符串影射到字節(jié)序列以及逆影射的操作。</p><p> Chan
43、nels:包含socket,file和pipe三種管道,它實際上是雙向交流的通道。</p><p> Selector:它將多元異步I/O操作集中到一個或多個線程中(它可以被看成是Unix中select()函數(shù)或Win32中WaitForSingleEvent()函數(shù)的面向?qū)ο蟀姹荆?lt;/p><p> 2.2.2 新I/O</p><p> 1)Buffer
44、 傳統(tǒng)的I/O不斷的浪費(fèi)對象資源(通常是String)。新I/O通過使用Buffer讀寫數(shù)據(jù)避免了資源浪費(fèi)。Buffer對象是線性的,有序的數(shù)據(jù)集合,它根據(jù)其類別只包含唯一的數(shù)據(jù)類型。java.nio.Buffer 類描述 java.nio.ByteBuffer 包含字節(jié)類型。 可以從ReadableByteChannel中讀在 WritableByteChannel中寫 java.nio.MappedByteBuffer
45、 包含字節(jié)類型,直接在內(nèi)存某一區(qū)域映射 java.nio.CharBuffer 包含字符類型,不能寫入通道 java.nio.DoubleBuffer 包含double類型,不能寫入通道 java.nio.FloatBuffer 包含float類型 java.nio.IntBuffer 包含int類型 java.nio.LongBuffer 包含long類型 java.nio.ShortBuffer 包含short類型
46、 可以通過調(diào)用allocate(int capacity)方法或者allocateDirect(in</p><p><b> 3.程序設(shè)計與編碼</b></p><p> 3.1開發(fā)平臺與工具</p><p> 3.1.1 J2EE平臺</p><p> J2EE ,即是Java2平臺企業(yè)版(Java 2
47、Platform Enterprise Edition),是原Sun公司(現(xiàn)已被甲骨文公司收購)為企業(yè)級應(yīng)用推出的標(biāo)準(zhǔn)平臺[13]。它簡化了企業(yè)解決方案的開發(fā)、部署和管理相關(guān)復(fù)雜問題的體系結(jié)構(gòu),J2EE技術(shù)的基礎(chǔ)就是核心Java平臺或Java 2平臺的標(biāo)準(zhǔn)版,其最終目的就是成為一個能夠使企業(yè)開發(fā)者大幅縮短投放市場時間的體系結(jié)構(gòu)。J2EE體系結(jié)構(gòu)提供中間層集成框架用來滿足無需太多費(fèi)用而又需要高可用性、高可靠性以及可擴(kuò)展性的應(yīng)用的需求。通過
48、提供統(tǒng)一的開發(fā)平臺,J2EE降低了開發(fā)多層應(yīng)用的費(fèi)用和復(fù)雜性,同時提供對現(xiàn)有應(yīng)用程序集成強(qiáng)有力支持,完全支持Enterprise JavaBeans,有良好的向?qū)еС执虬筒渴饝?yīng)用,添加目錄支持,增強(qiáng)了安全機(jī)制,提高了性能。</p><p> 3.1.2 集成環(huán)境</p><p> MyEclipse[14],是一個十分優(yōu)秀的用于開發(fā)Java, J2EE的Eclipse插件集合,MyE
49、clipse的功能非常強(qiáng)大,支持也十分廣泛,尤其是對各種開源產(chǎn)品的支持十分不錯。</p><p> MyEclipse企業(yè)級工作平臺(MyEclipse Enterprise Workbench ,簡稱MyEclipse)是對EclipseIDE的擴(kuò)展,利用它我們可以在數(shù)據(jù)庫和JavaEE的開發(fā)、發(fā)布以及應(yīng)用程序服務(wù)器的整合方面極大的提高工作效率。它是功能豐富的JavaEE集成開發(fā)環(huán)境,包括了完備的編碼、調(diào)試、
50、測試和發(fā)布功能,完整支持:HTML,Struts,JSP,CSS,Javascript,Spring,</p><p> SQL,Hibernate。</p><p> 3.2具體代碼實現(xiàn)步驟</p><p> 3.2.1下載使用的Jar包</p><p> 登錄http://mina.apache.org/mina-project/
51、downloads.html 下載 mina2.0.7.zip,解壓獲得mina-core-2.0.0-M1.jar</p><p> 登錄 http://www.slf4j.org/download.html 下載slf4j1.7.5.zip,解壓獲得slf4j-api-1.7.5.jar 與 slf4j-log4j12-1.7.5.jar</p><p> 添加Log4j的jar包
52、,注意如果使用slf4j-log4j12-XXX.jar,就需要添加log4j1.2.X。我這里使用的是log4j-1.2.14.jar (Logger配置詳情參見</p><p> http://mina.apache.org/first-steps.html )</p><p> 3.2.2工程創(chuàng)建配置</p><p> 創(chuàng)建一個Java Project(
53、默認(rèn)使用UTF-8編碼格式),添加log4j.properties</p><p> log4j.rootLogger=DEBUG,MINA,file</p><p> log4j.appender.MINA=org.apache.log4j.ConsoleAppender</p><p> log4j.appender.MINA.layout=org.apa
54、che.log4j.PatternLayout </p><p> log4j.appender.MINA.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss,SSS} %-5p %c{1} %x - %m%n</p><p> log4j.appender.file=org.apache.log4j.RollingFileAppe
55、nder</p><p> log4j.appender.file.File=./log/minademos.log</p><p> log4j.appender.file.MaxFileSize=5120KB</p><p> log4j.appender.file.MaxBackupIndex=10</p><p> log4j
56、.appender.file.layout=org.apache.log4j.PatternLayout</p><p> log4j.appender.file.layout.ConversionPattern=[VAMS][%d] %p | %m | [%t] %C.%M(%L)%n</p><p> 3.2.3.服務(wù)端程序</p><p> 創(chuàng)建服務(wù)端程
57、序:(服務(wù)端綁定8889端口)</p><p> public class MinaServer {</p><p> private static Logger logger = Logger.getLogger(MinaServer.class);</p><p> private static int PORT = 8889;</p>&l
58、t;p> public static void main(String[] args) {</p><p> IoAcceptor acceptor = null;</p><p><b> try {</b></p><p> // 創(chuàng)建一個非阻塞的server端的Socket</p><p> acc
59、eptor = new NioSocketAcceptor();</p><p> // 設(shè)置過濾器(使用Mina提供的文本換行符編解碼器)</p><p> acceptor.getFilterChain().addLast(</p><p><b> "codec",</b></p><p>
60、; new ProtocolCodecFilter(new TextLineCodecFactory(Charset</p><p> .forName("UTF-8"),</p><p> LineDelimiter.WINDOWS.getValue(),</p><p> LineDelimiter.WINDOWS.getValue(
61、))));</p><p> // 設(shè)置讀取數(shù)據(jù)的緩沖區(qū)大小</p><p> acceptor.getSessionConfig().setReadBufferSize(2048);</p><p> // 讀寫通道10秒內(nèi)無操作進(jìn)入空閑狀態(tài)</p><p> acceptor.getSessionConfig().setIdleT
62、ime(IdleStatus.BOTH_IDLE, 10);</p><p> // 綁定邏輯處理器</p><p> acceptor.setHandler(new Demo1ServerHandler());</p><p><b> // 綁定端口</b></p><p> acceptor.bind(ne
63、w InetSocketAddress(PORT));</p><p> logger.info("服務(wù)端啟動成功... 端口號為:" + PORT);</p><p> } catch (Exception e) {</p><p> logger.error("服務(wù)端啟動異常....", e);</p&
64、gt;<p> e.printStackTrace();</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> 創(chuàng)建服務(wù)端最主要的就是綁定服務(wù)端的消息編碼解碼過濾器和業(yè)務(wù)邏輯處
65、理器;</p><p> ?。?)業(yè)務(wù)邏輯處理器是MinaServerHandler---看它的具體實現(xiàn):</p><p> public class MinaServerHandler extends IoHandlerAdapter {</p><p> public static Logger logger = Logger.getLogger(Demo1
66、ServerHandler.class);</p><p><b> @Override</b></p><p> public void sessionCreated(IoSession session) throws Exception {</p><p> logger.info("服務(wù)端與客戶端創(chuàng)建連接..."
67、);</p><p><b> }</b></p><p><b> @Override</b></p><p> public void sessionOpened(IoSession session) throws Exception {</p><p> logger.info(&qu
68、ot;服務(wù)端與客戶端連接打開...");</p><p><b> }</b></p><p><b> @Override</b></p><p> public void messageReceived(IoSession session, Object message)</p><
69、p> throws Exception {</p><p> String msg = message.toString();</p><p> logger.info("服務(wù)端接收到的數(shù)據(jù)為:" + msg);</p><p> if ("bye".equals(msg)) { // 服務(wù)端斷開連接的條件<
70、;/p><p> session.close();</p><p><b> }</b></p><p> Date date = new Date();</p><p> session.write(date);</p><p><b> }</b></p>
71、;<p><b> @Override</b></p><p> public void messageSent(IoSession session, Object message) throws Exception {</p><p> logger.info("服務(wù)端發(fā)送信息成功...");</p><p
72、><b> }</b></p><p><b> @Override</b></p><p> public void sessionClosed(IoSession session) throws Exception {</p><p><b> }</b></p>&l
73、t;p><b> @Override</b></p><p> public void sessionIdle(IoSession session, IdleStatus status)</p><p> throws Exception {</p><p> logger.info("服務(wù)端進(jìn)入空閑狀態(tài)..."
74、;);</p><p><b> }</b></p><p><b> @Override</b></p><p> public void exceptionCaught(IoSession session, Throwable cause)</p><p> throws Excepti
75、on {</p><p> logger.error("服務(wù)端發(fā)送異常...", cause);</p><p><b> }</b></p><p><b> }</b></p><p> ?。?)使用命令行的telnet來測試下服務(wù)端程序</p><
76、p><b> 啟動服務(wù)端程序;</b></p><p> Windows下開始菜單,運(yùn)行,輸入cmd,回車;</p><p> 輸入:telnet 127.0.0.1 3005 回車</p><p> 連接成功后,服務(wù)端程序的后臺會打印如下信息:這個就是業(yè)務(wù)邏輯邏輯處理器打印的:</p><p> te
77、lnet中隨便輸入一個字符串,回車;則可以看到返回的日期;</p><p> 輸入bye,回車,提示服務(wù)端斷開連接</p><p> 如果需要重新測試,則需要再次重復(fù)C的步驟;</p><p> 3.2.4.客戶端程序</p><p> Mina能做服務(wù)端程序,自然也可以做客戶端程度啦。最重要的是,客戶端程序和服務(wù)端程序?qū)懛ɑ疽恢拢?/p>
78、很簡單的。</p><p><b> 客戶端代碼:</b></p><p> public class MinaClient01 {</p><p> private static Logger logger = Logger.getLogger(MinaClient01.class);</p><p> pri
79、vate static String HOST = "127.0.0.1";</p><p> private static int PORT = 3005;</p><p> public static void main(String[] args) {</p><p> // 創(chuàng)建一個非阻塞的客戶端程序</p><
80、p> IoConnector connector = new NioSocketConnector();</p><p> // 設(shè)置鏈接超時時間</p><p> connector.setConnectTimeout(30000);</p><p><b> // 添加過濾器</b></p><p>
81、 connector.getFilterChain().addLast(</p><p><b> "codec",</b></p><p> new ProtocolCodecFilter(new TextLineCodecFactory(Charset</p><p> .forName("UTF-8&q
82、uot;), LineDelimiter.WINDOWS.getValue(),</p><p> LineDelimiter.WINDOWS.getValue())));</p><p> // 添加業(yè)務(wù)邏輯處理器類</p><p> connector.setHandler(new Demo1ClientHandler());</p><
83、;p> IoSession session = null;</p><p><b> try {</b></p><p> ConnectFuture future = connector.connect(new InetSocketAddress(</p><p> HOST, PORT));// 創(chuàng)建連接</p>
84、<p> future.awaitUninterruptibly();// 等待連接創(chuàng)建完成</p><p> session = future.getSession();// 獲得session</p><p> session.write("Mina’s coming...");// 發(fā)送消息</p><p> } cat
85、ch (Exception e) {</p><p> logger.error("客戶端鏈接異常...", e);</p><p><b> }</b></p><p> session.getCloseFuture().awaitUninterruptibly();// 等待連接斷開</p><
86、p> connector.dispose();</p><p><b> }</b></p><p><b> }</b></p><p> 和服務(wù)端代碼極其相似,不同的是服務(wù)端是創(chuàng)建NioSocketAcceptor對象,而客戶端是創(chuàng)建NioSocketConnector對象;同樣需要添加編碼解碼過濾器和業(yè)
87、務(wù)邏輯過濾器;</p><p> ?。?)業(yè)務(wù)邏輯過濾器代碼:</p><p> public class ClientHandler extends IoHandlerAdapter {</p><p> private static Logger logger = Logger.getLogger(Demo1ClientHandler.class);<
88、/p><p><b> @Override</b></p><p> public void messageReceived(IoSession session, Object message)</p><p> throws Exception {</p><p> String msg = message.toS
89、tring();</p><p> logger.info("客戶端接收到的信息為:" + msg);</p><p><b> }</b></p><p><b> @Override</b></p><p> public void exceptionCaught(I
90、oSession session, Throwable cause)</p><p> throws Exception {</p><p> logger.error("客戶端發(fā)生異常...", cause);</p><p><b> }</b></p><p><b> }&l
91、t;/b></p><p> ?。?)測試服務(wù)端與客戶端程序</p><p> 啟動服務(wù)端,然后再啟動客戶端(客戶端發(fā)送的消息是“Mina’s coming...”)</p><p> 服務(wù)端接收消息并處理成功;</p><p><b> 客戶端接收響應(yīng)結(jié)果</b></p><p>&
92、lt;b> 4.系統(tǒng)說明書</b></p><p> 4.1開發(fā)環(huán)境及工具</p><p><b> 本系統(tǒng)所用的工具:</b></p><p> 服務(wù)器端:(Windows平臺)首先應(yīng)有java環(huán)境jdk,建議采用jdk1.5.0_07;MyEclipse8.5。</p><p> 客戶端:
93、 Flash客戶端</p><p> 本系統(tǒng)運(yùn)行所需用到的環(huán)境為:</p><p><b> 硬件配置 :</b></p><p> 中央處理器(CPU) :P4 2.0G以上的處理器;</p><p> 硬 盤:40GB以上硬盤;</p><p> 內(nèi) 存:256以上的DDR內(nèi)存
94、;</p><p> 顯 卡:128M以上顯存顯卡</p><p> 軟件配置:WINDOWS 7版本、MyEclipse8.5、j2sdk-1.42等。</p><p> 4.2本聊天室包括服務(wù)器和客戶端兩個部分:</p><p> 服務(wù)器具有管理日志,監(jiān)視聊天室的聊天內(nèi)容,發(fā)送系統(tǒng)消息,和消息中轉(zhuǎn)等功能。</p>
95、<p> 客戶端具有登錄,注冊用戶,多種方式的聊天,發(fā)送文本文件和播放音樂等功能。</p><p> 4.3具體的使用說明如下:</p><p> 服務(wù)器端:運(yùn)行服務(wù)器程序</p><p><b> 客戶端:</b></p><p> <1>進(jìn)入登陸界面,第一次登陸需要注冊,點注冊按扭。&
96、lt;/p><p> <2>按要求填完注冊信息。</p><p> <3>返回登陸窗口,輸入用戶名、密碼,進(jìn)行登陸。</p><p><b> <4>進(jìn)入聊天室。</b></p><p> 進(jìn)入聊天室后,就可以盡情的聊天了,可以和你喜歡的人私聊了,聊的開心話題還可以進(jìn)行保存,當(dāng)然,
97、你也可以清屏。</p><p><b> 參考文獻(xiàn)</b></p><p> [1]楊鐵軍,黃琳. MINA網(wǎng)絡(luò)框架和RMI的對比研究[J]. 計算機(jī)應(yīng)用與軟件. 2010,09:19-22</p><p> [2]陳華恩.JAVA非阻塞通信技術(shù)原理研究與實現(xiàn)[J]科技創(chuàng)新導(dǎo)報,2010,9:25-26</p><p&
98、gt; [3]劉寧,邱爽.基于Java的socket通訊的實現(xiàn)[J ].才智.2009,16:12-14</p><p> [4]馬喜春,張曾科.基于Socket進(jìn)行通用的網(wǎng)絡(luò)通信程序設(shè)計[J].實驗技術(shù)與管理,2005,3:32-33</p><p> [5]謝希仁.計算機(jī)網(wǎng)絡(luò)(第五版)[M].北京:電子工業(yè)出版社,2009,31-32</p><p>
99、[6]Sérgio Freire,André Zúquete.A TCP-layer name service for TCP ports[R]ATC'08: USENIX 2008 Annual Technical Conference on Annual Technical Conference, 2008</p><p> [7]金玉軍,姜曉彤,況迎輝.基于高性
100、能NIO的MINA框架的應(yīng)用[J].中國科技信息,2009,16:93-94</p><p> [8]曾冠東.基于Java構(gòu)建簡單高性能的NIO應(yīng)用[J].程序員,2008,2:55-57</p><p> [9]劉建亮,宋莉. Mina框架研究與實現(xiàn)[J]. 電腦編程技巧與維護(hù). 2010,07:113-116</p><p> [10]鄧軼婷.基于Mina
101、框架的Java通訊層應(yīng)用[J].中國科技博覽.2012,38:256-259</p><p> [11]王潔.JAVA NIO在Socket通訊中的應(yīng)用[J].成都信息工程學(xué)院學(xué)報,2003。18(3):258-261.</p><p> [12]張華,德基.基于Java NIO的通信技術(shù)研究灘坊學(xué)院學(xué)報,2008.8(4):44-48.</p><p> [
102、13]鄭阿奇,俞琰.J2EE應(yīng)用實踐教程[M].北京:電子工業(yè)出版社,2010,1-6</p><p> [14]Krill Paul,Genuitec introduces MyEclipse IDE for the Spring Framework[J].InfoWorld.com.2012, 6:342-347</p><p><b> 致 謝</b&
103、gt;</p><p> 在此論文撰寫過程中,要特別感謝我的導(dǎo)師李功麗的指導(dǎo)與督促,同時感謝她的諒解與包容。沒有李老師的幫助也就沒有今天的這篇論文。求學(xué)歷程是艱苦的,但又是快樂的。感謝我的輔導(dǎo)員李海燕老師,謝謝她在這四年中為我們?nèi)嗨龅囊磺?,她不求回報,無私奉獻(xiàn)的精神很讓我感動,再次向她表示由衷的感謝。在這四年的學(xué)期中結(jié)識的各位生活和學(xué)習(xí)上的摯友讓我得到了人生最大的一筆財富。在此,也對他們表示衷心感謝。<
104、;/p><p> 謝謝我的父母,沒有他們辛勤的付出也就沒有我的今天,在這一刻,將最崇高的敬意獻(xiàn)給你們!</p><p> 本文參考了大量的文獻(xiàn)資料,在此,向各學(xué)術(shù)界的前輩們致敬!</p><p><b> 錢永福</b></p><p> 2012年05月于河南師范大學(xué)</p><p><
105、;b> 致 謝</b></p><p> 要寫好一篇論文需要借助很多東西,也需要很多人的幫助和關(guān)心。因此,寫完這篇文章我要感謝的對象也有很多。</p><p> 首先,我要感謝我的指導(dǎo)老師李老師。她不僅耐心的幫我確定論文題目,還放下作為教師該有的神圣尊嚴(yán),以朋友的身份告訴我該如何完成這篇論文。她告訴我如何抓住一個具體方面來寫論文;她告訴我如何快速有效的搜集資料;
106、她告訴我如何快捷地找到相關(guān)論文;她告訴我哪個學(xué)校的網(wǎng)站有本專業(yè)的碩士、博士論文;她指導(dǎo)我如何利用手頭上的論文取舍嫁接整合。本論文的完成, 離不開她的悉心指導(dǎo)和孜孜不倦地教誨。</p><p> 其次,我要感謝那些與我朝夕相處了四年的大學(xué)同學(xué)。在寫畢業(yè)論文的這些日子里,是他們和我一起努力,共同進(jìn)退,相互鼓勵相互扶持,互相幫助,互通有無,及時溝通,以免出現(xiàn)論文撞車事件。使得我們都可以及時完成自己的畢業(yè)論文,都可以順
107、利畢業(yè)! </p><p><b> 致 謝</b></p><p> 四年的讀書生活在這個季節(jié)即將劃上一個句號,而于我的人生卻只是一個逗號,我將面對又一次征程的開始。四年的求學(xué)生涯在師長、親友的大力支持下,走得辛苦卻也收獲滿囊,在論文即將付梓之際,思緒萬千,心情久久不能平靜。 偉人、名人為我所崇拜,可是我更急切地要把我的敬意和贊美獻(xiàn)給一位平凡的人,
108、我的導(dǎo)師。我不是您最出色的學(xué)生,而您卻是我最尊敬的老師。您治學(xué)嚴(yán)謹(jǐn),學(xué)識淵博,思想深邃,視野雄闊,為我營造了一種良好的精神氛圍。授人以魚不如授人以漁,置身其間,耳濡目染,潛移默化,使我不僅接受了全新的思想觀念,樹立了宏偉的學(xué)術(shù)目標(biāo),領(lǐng)會了基本的思考方式,從論文題目的選定到論文寫作的指導(dǎo),經(jīng)由您悉心的點撥,再經(jīng)思考后的領(lǐng)悟,常常讓我有“山重水復(fù)疑無路,柳暗花明又一村”。 </p><p> 感謝我的爸爸媽
109、媽,焉得諼草,言樹之背,養(yǎng)育之恩,無以回報,你們永遠(yuǎn)健康快樂是我最大的心愿。在論文即將完成之際,我的心情無法平靜,從開始進(jìn)入課題到論文的順利完成,有多少可敬的師長、同學(xué)、朋友給了我無言的幫助,在這里請接受我誠摯謝意! </p><p> 同時也感謝學(xué)院為我提供良好的做畢業(yè)設(shè)計的環(huán)境。 </p><p> 最后再一次感謝所有在畢業(yè)設(shè)計中曾經(jīng)幫助過我的良師益友和同學(xué),以及在設(shè)計中被我引用或
110、參考的論著的作者。</p><p> 隨著這篇本科畢業(yè)論文的最后落筆,我四年的大學(xué)生活也即將劃上一個圓滿的句號?;貞涍@四年生活的點點滴滴,從入學(xué)時對大學(xué)生活的無限憧憬到課堂上對各位老師學(xué)術(shù)學(xué)識的深沉沉湎,從奔波于教室圖書館的來去匆匆到業(yè)余生活的五彩繽紛,一切中的一切都是歷歷在目,讓人倍感留戀,倍感珍惜。</p><p> 四年河南師范大學(xué)的學(xué)習(xí)生活注定將成為我人生中的一段重要旅程。四年
111、來,我的師長、我的領(lǐng)導(dǎo)、我的同學(xué)給予我的關(guān)心和幫助,使我終身收益,我真心地感謝他們。 </p><p> 在本文的撰寫過程中,李功麗老師作為我的指導(dǎo)老師,她治學(xué)嚴(yán)謹(jǐn),學(xué)識淵博,視野廣闊,為我營造了一種良好的學(xué)術(shù)氛圍。置身其間,耳濡目染,潛移默化,使我不僅接受了全新的思想觀念,樹立了明確的學(xué)術(shù)目標(biāo),領(lǐng)會了基本的思考方式,掌握了通用的研究方法,而且還明白了許多待人接物與為人處世的道理。其嚴(yán)以律己、寬以待人的崇高
112、風(fēng)范,樸實無華、平易近人的人格魅力,與無微不至、感人至深的人文關(guān)懷,令人如沐春風(fēng),倍感溫馨。正是由于她在百忙之中多次審閱全文,對細(xì)節(jié)進(jìn)行修改,并為本文的撰寫提供了許多中肯而且寶貴的意見,本文才得以成型。</p><p> 在此特向李功麗老師致以衷心的謝意!向她無可挑剔的敬業(yè)精神、嚴(yán)謹(jǐn)認(rèn)真的治學(xué)態(tài)度、深厚的專業(yè)修養(yǎng)和平易近人的待人方式表示深深的敬意!同時感謝院領(lǐng)導(dǎo)及輔導(dǎo)員李海燕老師幾年來對我的栽培和教育。<
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 本科畢業(yè)論文-基于
- 本科畢業(yè)論文-基于java的聊天系統(tǒng)的設(shè)計與實現(xiàn)
- 框架梁、框架柱截面設(shè)計-本科畢業(yè)論文
- 本科畢業(yè)論文
- 本科畢業(yè)論文
- 本科畢業(yè)論文
- 本科畢業(yè)論文抽屜原理及其應(yīng)用
- 數(shù)學(xué)本科畢業(yè)論文
- 本科畢業(yè)論文_5833
- 本科畢業(yè)論文正文
- 體育本科畢業(yè)論文
- 本科畢業(yè)論文(設(shè)計)
- 數(shù)學(xué)與應(yīng)用數(shù)學(xué)本科畢業(yè)論文
- 審計本科畢業(yè)論文
- 本科畢業(yè)論文[1]
- 法律本科畢業(yè)論文
- 臨床本科畢業(yè)論文
- 本科畢業(yè)論文模版
- 藥學(xué)本科畢業(yè)論文
- 本科畢業(yè)論文自述
評論
0/150
提交評論