版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、即時(shí)通訊軟件的設(shè)計(jì)與實(shí)現(xiàn)1系統(tǒng)實(shí)現(xiàn)模塊1.1服務(wù)端模塊服務(wù)端主要包括三個(gè)模塊:1. 網(wǎng)絡(luò)模塊,建立TCP月艮務(wù)器,負(fù)責(zé)監(jiān)聽端口,與客戶端建立連接并接受和 發(fā)送數(shù)據(jù)。2. 應(yīng)用模塊,負(fù)責(zé)處理從網(wǎng)絡(luò)模塊接收到的數(shù)據(jù),予以分析處理,進(jìn)行轉(zhuǎn)發(fā) 或?qū)?shù)據(jù)庫進(jìn)行操作,并返回相關(guān)信息。3. 數(shù)據(jù)層,數(shù)據(jù)層用來與數(shù)據(jù)庫建立連接,應(yīng)用模塊必須通過數(shù)據(jù)層來進(jìn)行 數(shù)據(jù)庫的操作。日志記錄圖4.1系統(tǒng)模塊圖1.2客戶端模塊用戶端包塊以下模塊:1. 用戶界面模塊,此模塊包括客戶端的操作界面,由NetBeans編寫的GUI,進(jìn)行了較多的美化,采用偏向 Vista的風(fēng)格。2. 網(wǎng)絡(luò)模塊,此模塊包括兩個(gè)小模塊,TCP模塊用于和
2、服務(wù)器端通訊,而 UDP 模塊則負(fù)責(zé)和客戶端進(jìn)行P2P通訊。3. 聊天模塊,此模塊負(fù)責(zé)在用戶聊天時(shí)候,對(duì)聊天的數(shù)據(jù)進(jìn)行圭寸裝,對(duì)聊天的 圖片也進(jìn)行壓縮,以適用網(wǎng)絡(luò)傳輸。在接受到聊天數(shù)據(jù)之后,又會(huì)對(duì)聊天數(shù)據(jù)進(jìn)行 分解操作,最后生成聊天內(nèi)容。4. 群組模塊,此模塊包括群組聊天、群組的創(chuàng)建、管理、更新等功能。5. 文件傳輸模塊,此模塊用于實(shí)現(xiàn)客戶端之間的文件傳輸功能。6. 視頻聊天模塊,此模塊用于實(shí)現(xiàn)客戶端之間的視頻聊天功能。7. 系統(tǒng)設(shè)置記錄模塊,此模塊用于實(shí)現(xiàn)保存聊天記錄,登錄日志,以及保存系 統(tǒng)設(shè)置信息的功能。系統(tǒng)記錄模塊圖4.2客戶端模塊圖2數(shù)據(jù)庫設(shè)計(jì)2.1用戶表設(shè)計(jì)用戶表是系統(tǒng)中的基礎(chǔ)表,
3、主要用來記錄用戶注冊(cè)時(shí)的各種信息,此表還有 一個(gè)從表userlogin表用來記錄用戶登錄和狀態(tài)信息。12Userinfo 表字段名1字段類型字段長(zhǎng)度備注IDInt11主鍵UseridInt11用戶IDNameVarchar20用戶名SexVarchar2性別ageInt4年齡CityVarchar50城市mailVarchar50信箱addressVarchar60地址Teleph oneVarchar15電話faceint2頭像號(hào)UserLogin 表字段名字段類型字段長(zhǎng)度備注UseridInt11用戶IDPassVarchar20用戶密碼FettleInt2用戶狀態(tài):IpaddressVa
4、rchar20IP地址2.2用戶關(guān)系表用戶關(guān)系表是用來保存用戶之間的好友關(guān)系的數(shù)據(jù)表,查詢好友列表的時(shí)候 要從此表中查詢與自己ID想關(guān)聯(lián)的好友ID,type字段可以設(shè)置兩者的關(guān)系,其中 1為好友關(guān)系,0為黑名單。字段名字段類型字段長(zhǎng)度備注Idint11主鍵UseridInt11用戶ID號(hào)Fren didInt11好友ID號(hào)TypeInt4關(guān)系類型其他表,如組群表,族群信息表就不在此一一列出3系統(tǒng)模塊的詳細(xì)設(shè)計(jì)此章節(jié)將敘述系統(tǒng)部分模塊的設(shè)計(jì)方法和具體實(shí)現(xiàn)。3.1網(wǎng)絡(luò)模塊的設(shè)計(jì)實(shí)現(xiàn)本系統(tǒng)采用TCP和UDP昆合的網(wǎng)絡(luò)通訊,客戶端與服務(wù)器之間登錄驗(yàn)證時(shí)采用 TCP連接,登錄之后,客戶端與服務(wù)器采用 U
5、DP方式保持通訊,客戶端和客戶端之 間采用UDP連接,如果無法直接連接,通過服務(wù)器申請(qǐng) UDP穿透NAT如果失敗, 則消息通過服務(wù)器中轉(zhuǎn)傳遞。因?yàn)橐诰W(wǎng)絡(luò)通訊中直接傳遞對(duì)象,故采用基于Java NIO的I/O的Cindy異步框架, Cindy 是一個(gè) Java 異步 I/O 框架,提供了一個(gè)統(tǒng)一高效的模型,同時(shí)支 持TCP UDP以及Pipe,并能夠方便的在異步和同步操作之間進(jìn)行切換。目前其實(shí) 現(xiàn)是基于Java NIO,并計(jì)劃通過JNI來支持各操作系統(tǒng)上本身提供的異步I/O功能,應(yīng)用可以方便的通過運(yùn)行期屬性來方便的切換到更為高效的實(shí)現(xiàn)上。 13Java NIO包雖然提供了非阻塞I/O模型,但是
6、直接使用 NIO的非阻塞I/O需 要成熟的網(wǎng)絡(luò)編程經(jīng)驗(yàn),處理眾多底層的網(wǎng)絡(luò)異常,以及維護(hù)連接狀態(tài),判斷連接 超時(shí)等等。對(duì)于關(guān)注于其業(yè)務(wù)邏輯的應(yīng)用而言,這些復(fù)雜性都是不必要的。不同 Java版本的NIO實(shí)現(xiàn)也會(huì)有一些Bug, Cindy會(huì)巧妙的繞開這些已知的 Bug并完成 相應(yīng)功能。并且NIO本身也在不斷發(fā)展中,Java 1.4的NIO包中只實(shí)現(xiàn)了 TCP/UDP 單播/Pipe , Java 5.0中引入的SSLE ngine類使得基于非阻塞的流協(xié)議(TCP/Pipe)支持SSL/TLS成為可能。使用Cindy,應(yīng)用可以在同步和異步之間進(jìn) 行無縫切換,對(duì)于大部分操作是異步,可某些特殊操作需要同
7、步的應(yīng)用而言,這極 大的提高了易用性。 141. 服務(wù)器端編碼: SessionAcceptor acceptor ; acceptor=SessionFactory.createSessionAcceptor(SessionType.TCP); acceptor.setListenPort(port);/ 設(shè)置監(jiān)聽端口 port 為端口號(hào)acceptor.setAcceptorHandler(new SessionAcceptorHandlerAdapter();/ 設(shè)置 SessionAcceptorHandler ;SessionAcceptorHandler 接口是處理 Session
8、Acceptor 產(chǎn)生的各種事件 , SessionHandler 接口則用于處理 Session 產(chǎn)生的各種事件。acceptor.start(); /開始執(zhí)行,服務(wù)器開始監(jiān)聽TCP連接。SessionAcceptorHandlerAdapter 類是處理 acceptor 時(shí)間的接口,里面包括了各 種方法,我們主要使用到對(duì)象接收事件( objectReceived ),我們接受到對(duì)象以后 再對(duì)其進(jìn)行處理。代碼如下:new SessionAcceptorHandlerAdapter()public void sessionAccepted(SessionAcceptor acceptor,
9、Session session) throws Exception session.setPacketEncoder(new SerialEncoder(); session.setPacketDecoder(new ServerPacketDecoder(); session.setSessionHandler(new SessionHandlerAdapter() public void objectReceived(Session session, Object obj)/*這里可以得到接受到的對(duì)象,我們圭寸裝成Message類*/Message message=(Message)obj
10、;2. 服務(wù)端編碼首先先生成一個(gè)TCP的Session,然后為session設(shè)置遠(yuǎn)程IP地址,最后通 過設(shè)置 SessionHandlerAdapter ()來處理事件。Session session=SessionFactory.createSession(SessionType.TCP); session.setRemoteAddress(new InetSocketAddress(address,port); session.setPacketEncoder(new SerialEncoder();session.setPacketDecoder(new SerialDecoder();
11、session.setSessionTimeout(0);session.setSessionHandler(new SessionHandlerAdapter() ;3.2 用戶登錄的具體實(shí)現(xiàn)前面介紹了 Cindy 的網(wǎng)絡(luò)框架,現(xiàn)在我們來演示用戶登錄時(shí)候的流程。用戶 登錄請(qǐng)求處理模塊是用戶通過了驗(yàn)證 ( 驗(yàn)證過程在信息查詢服務(wù)器上完成 ),取得了 合法登錄密鑰之后,登錄文字通訊服務(wù)器的第一步。用戶登錄請(qǐng)求處理模塊的處理過程是 : 接收用戶登錄請(qǐng)求,首先判斷其登錄密 碼是否正確 ( 登錄密碼是用戶注冊(cè)時(shí)候輸入的口令,服務(wù)器收到該請(qǐng)求后,首先查 詢數(shù)據(jù)庫中此用戶 ID 的密碼,然后判斷和用戶發(fā)送
12、的登錄密碼是否一致)。如密鑰不正確則關(guān)閉該連接,并發(fā)送密碼錯(cuò)誤的信息。如果密鑰正確,則修改該用戶在數(shù) 據(jù)庫中的 IP 記錄,并從數(shù)據(jù)庫中讀取出其所有的好友列表,并將此用戶上線的消 息發(fā)送給其好友,服務(wù)器同時(shí)將此用戶此時(shí)此刻登錄的情況記錄在日志中??蛻舳耸盏矫艽a驗(yàn)證正確的消息之后,會(huì)受到服務(wù)器發(fā)送來的好友列表和詳 細(xì)信息,并通過這個(gè)好友列表構(gòu)建好友信息,完成登錄。在客戶端中,我們提供了隱身上線,和保存密碼兩個(gè)選擇項(xiàng),其內(nèi)容保存在 Hitayo.ini 文件中。在登錄窗口中,可以手動(dòng)輸入服務(wù)器的 IP 地址,并將新的服 務(wù)器地址保存進(jìn)服務(wù)器選擇列表,下次登錄時(shí),可以自動(dòng)選擇到上次登錄的服務(wù)器 地址
13、,同時(shí)還具備檢測(cè)服務(wù)器是否暢通的功能。登錄窗口界面如下:3.3聊天模塊的具體實(shí)現(xiàn)圖4.3客戶端登錄界面一款即時(shí)通訊軟件,最基本的功能莫過于即時(shí)聊天功能。在本系統(tǒng)中,對(duì)聊 天信息重新封裝(ChatSeria類),使系統(tǒng)的聊天功能支持對(duì)文字的字體、大小、 粗細(xì)、顏色進(jìn)行設(shè)置,還能夠在文字中插入圖片,并能支持快捷鍵,用Ctrl +*于加WFfKf的卿刃澤天軟仲.Enter可以發(fā)送消息。圖4.4聊天窗口界面實(shí)現(xiàn)功能的關(guān)鍵在于對(duì)聊天信息封裝和對(duì)文字中圖片的定位和還原,以下代 碼實(shí)現(xiàn)了圖文混合后對(duì)聊天信息的還原:for(i nt x=0;xS! I1 較.IM20汽000 ”9 23TaW. 1*035I
14、kT AZ02. IBT.15,3on蠱Ur冷詩1ST. 34. LEKzIlMOO 1ST. FL 291:1136Scmsr S211237aGa 1I123S圖4.6 UDP穿透示意圖3. Client A 通過 Server S 得到 B 的 IP 地址是 187.34.1.56 : 40000,然后 Client A 向此IP發(fā)送信息,NAT B拋棄此條信息。4. Client A 通知 Server S,申請(qǐng) UDP穿透。5. Server S 通知Client B,并將 Client A 的IP地址和端口告訴 Client B;6. Clie nt B留下一個(gè)Session。收到
15、信息以后,像Client A 也發(fā)送一條消息,便會(huì)在 NAT B上7. Client A再向Client B 發(fā)送信息時(shí)候,NAT B會(huì)將消息轉(zhuǎn)發(fā)給 ClientBo8. 完成UDP穿透,Client A 和Client B 可以互相通訊。3.6文件傳輸模塊的設(shè)計(jì)文件傳輸是即時(shí)聊天軟件的主要功能之一,而文件的特殊性也決定了對(duì)于通 過網(wǎng)絡(luò)通信實(shí)現(xiàn)文件的傳輸,可靠性與完整性的要求都很高。根據(jù)需求分析在本模 塊兒的設(shè)計(jì)中,我們未采納UDP的傳輸方式。但是,目前處于兩個(gè)原因的考慮:1)IP地址短缺;2)網(wǎng)絡(luò)安全防止黑客軟件和病毒的泛濫。大部分上網(wǎng)的個(gè) 人計(jì)算機(jī)都被“隱藏”于防火墻或者 NAT之后。這就
16、在很大程度上阻擋了面向連接 的對(duì)等端實(shí)現(xiàn)TCP互聯(lián)。因此,在此模塊中,為適應(yīng)各種情況,保證文件的成功傳 輸,我們采取了 P2P和C/S模式并存,互為補(bǔ)充的模式,以 P2P方式為主。在進(jìn)行 文件傳輸時(shí),首先采取 P2P方式進(jìn)行互聯(lián)。如果由于任何原因點(diǎn)對(duì)點(diǎn)方式不能成 功,系統(tǒng)或自動(dòng)采取點(diǎn)對(duì)服務(wù)器方式,從而確保文件傳輸?shù)某晒ΓK設(shè)計(jì)結(jié)構(gòu)如 圖圖4.7 P2P連接示意圖系統(tǒng)采用TCP的方式發(fā)送,通過 CIND丫的框架下,對(duì)文件進(jìn)行分包發(fā)送的代 碼如下:發(fā)送方(部分)for (int i = 1; i = QUEUE_SIZE; i+) Buffer buffer = BufferFactory.al
17、locate(MESSAGE_SIZE);buffer.positi on( 2);int readCo unt = buffer.read(fc);/ readCou nt為-1則文件已經(jīng)讀取完畢,發(fā)送完成關(guān)閉if (readCou nt = -1) buffer.release();future.getSessio n().close();elsebuffer.putU nsig nedShort(0, readCou nt).flip();/開始發(fā)送session.send(buffer);接收方 ( 部分 )Buffer buffer = (Buffer) obj;if (fc = n
18、ull) fileName = buffer.getString(Charset.UTF8, buffer.remaining();fc = new RandomAccessFile(fileName, rw).getChannel(); else while (buffer.hasRemaining()buffer.write(fc); / 寫入文件3.7 組群功能的具體實(shí)現(xiàn)組群功能是即時(shí)聊天軟件的一大進(jìn)步,取代了曾經(jīng)的基于WEB的聊天室。本系統(tǒng)的組群功能支持,組群的建立,加入組群,管理組群,組群公告,組群聊天等 功能,每一個(gè)用戶登錄以后,都可以在組群欄中創(chuàng)建自己的組群,并添加用戶到組 群中來。創(chuàng)建組群的用戶將成為組群的管理員,能夠管理組群用戶和修改組群的資料 信息等。組群聊天模式采用 TCP 連接服務(wù)器轉(zhuǎn)發(fā),之所以采用這種模式是考慮到所以 用戶已經(jīng)和服務(wù)器連接起來了,通過 TCP轉(zhuǎn)發(fā)能夠降低程序的復(fù)雜性,不過從實(shí)際 考慮,如果要投入實(shí)際運(yùn)行,應(yīng)該將 TCP的組群聊天室改為UDP形式。組群聊天同樣支持文字的字體、顏色、大小、粗細(xì)進(jìn)行設(shè)定,同時(shí)也支持圖 文并茂。3.8 聊天記錄模塊的實(shí)現(xiàn) 本系統(tǒng)支持聊天記錄的保存和查閱,在這里采用的是文件保存的形式,將聊 天記錄保存為文本文件,位置在程序目錄中的用戶 ID 目錄里,以好友的 ID 命名。 選擇
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 電子房屋買賣合同格式范本編寫示例
- 投標(biāo)安全承諾函
- 八年級(jí)生物下冊(cè) 7.1.1 植物的生殖教案 (新版)新人教版
- 河北省安平縣八年級(jí)地理上冊(cè) 1.1 遼闊的疆域教學(xué)設(shè)計(jì) 新人教版
- 八年級(jí)物理上冊(cè) 第二章 聲現(xiàn)象 第2節(jié) 聲音的特性第2課時(shí)聲音的特性綜合應(yīng)用教案 (新版)新人教版
- 2023六年級(jí)英語上冊(cè) Review Module Unit 2教案 外研版(三起)
- 2024-2025學(xué)年新教材高中化學(xué) 第1章 原子結(jié)構(gòu) 元素周期表 第2節(jié) 元素周期律和元素周期表 微專題二 元素“位-構(gòu)-性”之間的關(guān)系教案 魯科版必修第二冊(cè)
- 2024-2025年高中語文 第3單元 單元導(dǎo)讀教案 粵教版必修1
- 2024-2025學(xué)年高中歷史 第四單元 工業(yè)文明沖擊下的改革 第15課 戊戌變法(2)教學(xué)教案 岳麓版選修1
- 雨污管道勞務(wù)包工細(xì)分合同(2篇)
- 《廉潔主題班會(huì)》課件
- JT-T-617.1-2018危險(xiǎn)貨物道路運(yùn)輸規(guī)則第1部分:通則
- 2024年貴州省中考化學(xué)試卷真題(含答案及解析)
- 2024南京旅游職業(yè)學(xué)院教師招聘考試筆試試題
- 2023年廣東省普通高中數(shù)學(xué)學(xué)業(yè)水平合格性考試真題卷含答案
- 人工智能知識(shí)競(jìng)賽題庫及答案(500題)
- 跨地區(qū)經(jīng)營納稅企業(yè)的分支機(jī)構(gòu)年度納稅申報(bào)表(2021年版)
- 《高血壓中醫(yī)診療專家共識(shí)》解讀
- 2024地理中考復(fù)習(xí)-七年級(jí)上冊(cè)知識(shí)點(diǎn)總結(jié)(打印版)
- 2023年室內(nèi)裝飾設(shè)計(jì)師(三級(jí))理論考試復(fù)習(xí)題庫(含答案)
- 《裝在套子里的人》劇本演繹推理+課件++2023-2024學(xué)年統(tǒng)編版高中語文必修下冊(cè)
評(píng)論
0/150
提交評(píng)論