歐道杰,段元梅
(湖南科技學(xué)院 信息工程學(xué)院,湖南 永州 425199)
隨著Internet 的迅速發(fā)展,計(jì)算機(jī)在各個(gè)領(lǐng)域應(yīng)用相當(dāng)廣泛,已是不可或缺的工具。通信軟件作為一種新型的通信和交流工具,突破了地域的限制,可以提供更為便捷、靈活、全面的信息傳遞和服務(wù),具有極其廣泛的發(fā)展前景。本文旨在開(kāi)發(fā)一款方便網(wǎng)絡(luò)用戶之間進(jìn)行文字、表情等交流的通信系統(tǒng)??梢酝ㄟ^(guò)通信軟件結(jié)交各個(gè)層次的朋友,從而為自己獲取更多的知識(shí)和社會(huì)閱歷[1]。
用戶可通過(guò)該即時(shí)通信軟件的客戶端實(shí)現(xiàn)以下功能:(1)注冊(cè)功能:用來(lái)提交用戶的相關(guān)資料,從而獲得一個(gè)用于登錄系統(tǒng)的用戶賬號(hào);(2)登錄功能:用來(lái)建立與服務(wù)器的連接,驗(yàn)證用戶信息并登錄,顯示登錄出錯(cuò)信息;(3)界面顯示功能:用來(lái)顯示所有好友的在線狀態(tài)和個(gè)人信息;(4)添加好友功能:用來(lái)處理用戶之間的好友添加請(qǐng)求,并對(duì)添加好友請(qǐng)求做出相應(yīng)的響應(yīng);(5)加密通信功能:用來(lái)添加好友,成功后,好友之間進(jìn)行文字聊天、文件傳輸?shù)燃用芡ㄐ臶2]。
該即時(shí)通信系統(tǒng)的服務(wù)器端用來(lái)接收來(lái)自客戶端的各種信息,并對(duì)接收的信息做出相應(yīng)處理。服務(wù)器通過(guò)信息接收功能來(lái)接收客戶端發(fā)送的信息;登錄處理功能是服務(wù)器通過(guò)驗(yàn)證登錄信息,并給出相應(yīng)處理;好友添加處理功能是服務(wù)器將用戶的好友信息寫(xiě)入數(shù)據(jù)庫(kù)的操作;用戶退出處理功能是服務(wù)器在用戶退出即時(shí)通信軟件后,將此用戶下線消息發(fā)給各客戶端,并改寫(xiě)用戶在服務(wù)器端的狀態(tài)[3-4]。
該系統(tǒng)需要一個(gè)方便用戶使用的個(gè)性化界面。第一次使用該系統(tǒng)的用戶通過(guò)填寫(xiě)個(gè)人資料來(lái)注冊(cè),服務(wù)器返回一個(gè)注冊(cè)賬號(hào)用于之后的登錄。已經(jīng)注冊(cè)的用戶輸入賬號(hào)和密碼,驗(yàn)證登錄信息,若正確則登錄主界面。在線用戶通過(guò)查看所要添加好友的個(gè)人信息,并向好友發(fā)送請(qǐng)求信息,好友通過(guò)驗(yàn)證后,向請(qǐng)求方發(fā)送響應(yīng)消息。請(qǐng)求方添加完成后,把相關(guān)信息存入數(shù)據(jù)庫(kù)的好友表中。如果好友雙方同時(shí)在線,即可進(jìn)行通信。
該即時(shí)通信系統(tǒng)采用C/S 模式設(shè)計(jì),主要包括客戶端、服務(wù)器??蛻舳颂峁┯脩糇?cè)賬號(hào)、用戶登錄、用戶添加好友及對(duì)方響應(yīng)、好友之間通信等服務(wù)。服務(wù)器用來(lái)對(duì)注冊(cè)登錄的用戶進(jìn)行管理以及對(duì)客戶端發(fā)送的請(qǐng)求信息做出相應(yīng)處理。服務(wù)器與客戶端之間采用UDP 協(xié)議進(jìn)行可靠通信,可以大幅度減少因多客戶端給服務(wù)器帶來(lái)的壓力。多個(gè)請(qǐng)求通信的客戶端之間使用UDP 通過(guò)服務(wù)器中轉(zhuǎn)進(jìn)行通信。該通信軟件包含了用戶注冊(cè)模塊、用戶登錄模塊、添加好友模塊、加密通信模塊、服務(wù)器模塊。
通信層在服務(wù)器中非常重要,它的功能是接收客戶端發(fā)送的數(shù)據(jù),并將數(shù)據(jù)傳輸給上層服務(wù)。服務(wù)器相對(duì)于客戶端來(lái)說(shuō),需要承受非常大的壓力??蛻舳擞星f(wàn)萬(wàn),但服務(wù)器只能有一個(gè),對(duì)于通信層來(lái)說(shuō),將會(huì)是一個(gè)非常大的壓力。因此,不能像普通通信那樣,直接在主線程建立一個(gè)Socket,然后等待接收。當(dāng)很多客戶端連接服務(wù)器時(shí),服務(wù)器可能會(huì)崩潰。為解決這個(gè)問(wèn)題,筆者為數(shù)據(jù)的接收和發(fā)送開(kāi)辟一個(gè)通信線程,讓該線程專(zhuān)門(mén)用來(lái)發(fā)送和接收數(shù)據(jù)。為了讓通信線程更流暢,筆者將接收和發(fā)送的數(shù)據(jù)放到另一個(gè)線程來(lái)處理,這個(gè)線程叫數(shù)據(jù)處理線程。
2.4.1 通信層的設(shè)計(jì)與實(shí)現(xiàn)
通信層是客戶端的底層,用來(lái)實(shí)現(xiàn)與服務(wù)器的數(shù)據(jù)通信。它和服務(wù)器的網(wǎng)絡(luò)層功能一樣,只是客戶端和服務(wù)器端所承受的壓力不同,所以在客戶端的通信層中,筆者刪減了完成端口模型的使用。
2.4.2 中間層的設(shè)計(jì)與實(shí)現(xiàn)
中間層是承上啟下的一層,它是通信層和應(yīng)用層的一個(gè)緩沖層。由于應(yīng)用層中有很多的UI 界面設(shè)計(jì),因而使得應(yīng)用層和通信層的數(shù)據(jù)在類(lèi)型方面存在差異,數(shù)據(jù)也很難直接進(jìn)行傳送。中間層在應(yīng)用層和通信層中間進(jìn)行數(shù)據(jù)的轉(zhuǎn)換和傳遞,為應(yīng)用層和通信層搭建了一座橋。中間層將應(yīng)用層傳來(lái)的數(shù)據(jù)進(jìn)行處理后傳給通信層,將通信層的數(shù)據(jù)處理后傳給應(yīng)用層。為了能讓底層(通信層)的數(shù)據(jù)送達(dá)給上層(應(yīng)用層),筆者在程序中使用了回調(diào)機(jī)制,可以很方便地解決從底層給上層發(fā)送數(shù)據(jù)。
2.4.3 應(yīng)用層的設(shè)計(jì)與實(shí)現(xiàn)
(1)UI 界面設(shè)計(jì)與實(shí)現(xiàn)。
客戶端的UI 界面是基于MFC 框架開(kāi)發(fā),加入了DUI 的設(shè)計(jì)思想,對(duì)窗口中的很多原始控件進(jìn)行自繪,使界面既符合設(shè)計(jì)要求,又比較美觀。在主界面中對(duì)CListCtrl 控件自繪,讓它能顯示好友的需求,在好友界面中顯示更多的信息。對(duì)CButton 控件進(jìn)行自繪,讓按鈕顯得更為美觀也能適應(yīng)更多情況的使用。
(2)硬性功能設(shè)計(jì)與實(shí)現(xiàn)。
用戶注冊(cè)、用戶登錄、信息展示、好友管理、分組管理、好友聊天等這些是一個(gè)通信軟件必不可少的功能,稱之為硬性功能。這些硬性功能都和UI 界面有著很大的關(guān)聯(lián),要么是從UI 層獲取數(shù)據(jù),要么是將數(shù)據(jù)在UI 層顯示。
信息展示是一個(gè)扇形的模塊,它在各個(gè)功能模塊中都有出現(xiàn)?;驹硎菍?shù)據(jù)和UI 結(jié)合,最后以用戶能夠接受的方式展示出來(lái)。以往這個(gè)模塊,在顯示數(shù)據(jù)時(shí),大多數(shù)都是等整個(gè)數(shù)據(jù)都加載完后再顯示。而本模塊是邊加載邊顯示,即來(lái)多少顯示多少,這會(huì)讓用戶感覺(jué)到傳輸速度有了提升。當(dāng)然這種模式和底層數(shù)據(jù)編碼有關(guān)。在底層數(shù)據(jù)編碼和在上層數(shù)據(jù)顯示中,將整個(gè)大的模塊的數(shù)據(jù)分成N個(gè)小的結(jié)點(diǎn)。這種方式有利于傳輸和顯示,底層不用等數(shù)據(jù)傳輸完就可以發(fā)給上層,上層展示模塊也不用等整個(gè)數(shù)據(jù)接收完再顯示,即可邊傳輸邊顯示,讓用戶感覺(jué)更流暢。
好友聊天是本軟件的核心模塊,是用戶進(jìn)行聊天的模塊,用戶通過(guò)此功能和好友進(jìn)行聊天通信。本軟件還對(duì)聊天消息進(jìn)行了處理,支持表情顯示和發(fā)送。該系統(tǒng)的聊天模塊流程是,當(dāng)用戶輸入信息點(diǎn)擊發(fā)送后,系統(tǒng)獲取用戶輸入的數(shù)據(jù),經(jīng)過(guò)中間層對(duì)數(shù)據(jù)進(jìn)行處理,然后交由底層發(fā)送給服務(wù)器,由服務(wù)器轉(zhuǎn)發(fā)給好友,最后在好友聊天窗口中顯示。
該系統(tǒng)測(cè)試主要圍繞功能測(cè)試、模塊測(cè)試和確認(rèn)測(cè)試進(jìn)行。注冊(cè)與登錄模塊的測(cè)試主要是測(cè)試網(wǎng)絡(luò)的連通性、數(shù)據(jù)可靠性以及信息的正確性等。信息展示模塊主要是測(cè)試能否正確顯示相關(guān)信息。好友聊天模塊主要測(cè)試其數(shù)據(jù)是否能順利到達(dá)對(duì)方及順利顯示。登錄與主窗口模塊測(cè)試從登錄窗口能否順利地轉(zhuǎn)到主窗口,兩者之間有沒(méi)有出現(xiàn)由于接口問(wèn)題的信息亂碼現(xiàn)象。
本文對(duì)通信系統(tǒng)的設(shè)計(jì)思想進(jìn)行了革新,從軟件框架入手設(shè)計(jì)軟件,從大局著想,為以后的軟件設(shè)計(jì)與開(kāi)發(fā)奠定了基礎(chǔ)。本文還利用Socket 技術(shù)解決軟件的通信問(wèn)題,并在Socket 的基礎(chǔ)上使用完成端口模型來(lái)解決因高并發(fā)量而給服務(wù)器帶來(lái)的壓力。