即時(shí)通訊軟件的設(shè)計(jì)與實(shí)現(xiàn)_第1頁
即時(shí)通訊軟件的設(shè)計(jì)與實(shí)現(xiàn)_第2頁
即時(shí)通訊軟件的設(shè)計(jì)與實(shí)現(xiàn)_第3頁
即時(shí)通訊軟件的設(shè)計(jì)與實(shí)現(xiàn)_第4頁
即時(shí)通訊軟件的設(shè)計(jì)與實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論