- 相關(guān)推薦
牛人編寫(xiě)聊天工具的心得
做一個(gè)聊天軟件,首先要懂得網(wǎng)絡(luò)通信的基礎(chǔ)TCP\IP,UDP之類的協(xié)議,還有socket編程。實(shí)現(xiàn)兩臺(tái)電腦之間的通信是非常簡(jiǎn)單的,對(duì)于UDP是無(wú)連接的傳輸層協(xié)議,不像TCP那樣需要accept和connect什么的需要確保連接。但是UDP又是不可靠的,但是相對(duì)來(lái)說(shuō),我覺(jué)得對(duì)于即時(shí)聊天軟件來(lái)說(shuō),使用udp還是足夠的。于是我采用了UDP協(xié)議來(lái)貫穿我的軟件。當(dāng)然一般的不加修飾的Socket,只能實(shí)現(xiàn)同類網(wǎng)絡(luò)地址下的通信,對(duì)于一個(gè)不同內(nèi)網(wǎng)的計(jì)算機(jī),將無(wú)法進(jìn)行通信,這樣也大大局限了我們軟件的使用范圍,所以我采用了UDP下的NAT穿透技術(shù)來(lái)突破這一障礙,具體理論我們參照這篇文章。
先談?wù)務(wù)w的思想吧,這個(gè)即時(shí)聊天軟件是以C/S構(gòu)架的,服務(wù)器主要負(fù)責(zé)客戶的信息轉(zhuǎn)發(fā),當(dāng)然只是客戶本身的IP、各種端口(消息監(jiān)聽(tīng),文件監(jiān)聽(tīng))、用戶名之類的屬性,他不直接參與客戶之間的通訊,只有當(dāng)客戶之間需要nat穿透的時(shí)候才會(huì)通過(guò)服務(wù)器通知需要通信的一方向另一方發(fā)送"打洞"請(qǐng)求,另外還處理客戶之間的登錄和下線事件的廣播,所以服務(wù)器的壓力會(huì)比較小。
至于客戶端,我采用了傳統(tǒng)的聊天軟件的慣用方式,一個(gè)主對(duì)話框,顯示好友信息。出于減小難度,我只采用一個(gè)樹(shù)控件來(lái)控制這些好友信息,而沒(méi)有采用tab類型的控件,即使采用也是要花費(fèi)一定的功夫去重寫(xiě)這些控件類,才能滿足我們的要求。然后通過(guò)雙擊樹(shù)控件的子項(xiàng)來(lái)彈出聊天對(duì)話框,說(shuō)到這里我不得不說(shuō)一下C++的確是高處C一大籌,(封裝、繼承、多態(tài))這是在是太帥了。創(chuàng)建這些聊天對(duì)話框時(shí),將傳入對(duì)應(yīng)的客戶IP、對(duì)話框指針、用戶名(號(hào)碼)等以用來(lái)正確識(shí)別。主程序運(yùn)行就掛起一個(gè)消息監(jiān)聽(tīng)線程,來(lái)循環(huán)監(jiān)聽(tīng)從不同客戶發(fā)來(lái)的消息,然后進(jìn)行不同的處理,所以使用了較多的宏,吧來(lái)自不同客戶的消息傳給不同的本地聊天對(duì)話框處理,所以剛才說(shuō)的在創(chuàng)建聊天對(duì)話框的時(shí)候的參數(shù)就非常重要了,處理不好可能會(huì)出現(xiàn)差錯(cuò)。諸多細(xì)節(jié)在這里還是比較難以細(xì)說(shuō)。雖然采用了UDP傳輸協(xié)議,但是我通過(guò)消息回執(zhí)來(lái)確保消息發(fā)送成功,這個(gè)回執(zhí)將決定是否進(jìn)行打洞處理。而在文件傳輸功能上的實(shí)現(xiàn),采用了TCP傳輸層協(xié)議(我也不知道為什么自己就選擇了這個(gè),估計(jì)是但是第一感覺(jué)需要accept和connect),我是在主程序運(yùn)行時(shí)就掛起一個(gè)文件監(jiān)聽(tīng)線程,當(dāng)然這個(gè)監(jiān)聽(tīng)端口是在程序運(yùn)行是,沒(méi)有登錄服務(wù)器之前就首先動(dòng)態(tài)獲取的,我只是循環(huán)地查找沒(méi)有被占用的端口并綁定套接字。在有客戶發(fā)來(lái)文件傳送請(qǐng)求時(shí),就創(chuàng)建一個(gè)文件接收和發(fā)送線程。感覺(jué)以上這些還是比較容易實(shí)現(xiàn)的。當(dāng)然采用類的思想才會(huì)比較清晰,否則會(huì)比較亂。
再講講其他一些小小細(xì)節(jié),比如那個(gè)菜單的實(shí)現(xiàn),如果采用對(duì)話框的默認(rèn)菜單,我們都會(huì)覺(jué)得比較惡心,的確有點(diǎn)難看,所以我把對(duì)話框的菜單欄卻掉了,然后添加了ON_WM_NCHITTEST()消息,實(shí)現(xiàn)無(wú)菜單的客戶區(qū)拖動(dòng),然后重寫(xiě)個(gè)Button類來(lái)實(shí)現(xiàn)png圖片的裝飾,實(shí)現(xiàn)鼠標(biāo)經(jīng)過(guò)、懸停和按下的狀態(tài)(就像qq的最小化和關(guān)閉按鈕那樣的效果),當(dāng)然,我使用的是VC6開(kāi)發(fā)的,不能直接使用GDI+,所以配置了一下才行(具體方法自己網(wǎng)上一查就知道了)。然后那個(gè)對(duì)話框的主背景,也是通過(guò)把一張png圖片繪上去的,當(dāng)然還要解決一些閃爍的問(wèn)題,可以采用雙緩沖來(lái)解決。在做界面的時(shí)候,我深感自己缺乏藝術(shù)細(xì)胞,ps技術(shù)實(shí)在太爛,做的按鈕圖片比較難看,顏色搭配和漸變效果實(shí)在難以控制。而文件實(shí)現(xiàn)拖拽發(fā)送也比較簡(jiǎn)單,增加個(gè)ON_WM_DROPFILES()消息函數(shù),對(duì)話框拓展屬性勾上Accept File就好了,剩下的就是處理路徑的問(wèn)題了,還有多個(gè)文件的同時(shí)拖拽問(wèn)題。還有就是那個(gè)表情是比較難以處理的一個(gè)模塊,當(dāng)時(shí)就調(diào)試了我一個(gè)星期才解決,為了添加表情功能,我不得不放棄原來(lái)使用的EDIT控件(由于以前都只是使用EDIT),使用了RICHEDIT控件,使用該控件還是有很多細(xì)節(jié)要處理的,比如初始化才能使用啊什么的,當(dāng)然為了實(shí)現(xiàn)表情的功能,我還是得重新寫(xiě)RICHEDIT這個(gè)類,拓展一下。因?yàn)槲沂鞘褂棉D(zhuǎn)義碼來(lái)實(shí)現(xiàn)的,每一個(gè)表情對(duì)應(yīng)一個(gè)轉(zhuǎn)義碼,就像c語(yǔ)言中\(zhòng)n代表?yè)Q行一樣。重寫(xiě)的類中要實(shí)現(xiàn),文本的添加和當(dāng)文本改變時(shí)要處理一些諸如是否寫(xiě)入了轉(zhuǎn)義碼,超鏈接等等,至于那個(gè)表情布,只是一張小小的銀白色的圖片為底,然后再圖片上分出很多個(gè)小小的矩形來(lái)容納一個(gè)個(gè)小小的表情按鈕,很多按鈕吧,沒(méi)錯(cuò)!每個(gè)小小的表情都是覆蓋在按鈕上的,同樣要實(shí)現(xiàn)鼠標(biāo)經(jīng)過(guò)懸停和按下的事件,還得畫(huà)一下那個(gè)藍(lán)色的邊框?傊@個(gè)表情功能的添加,我耗費(fèi)較多的時(shí)間了,明白一點(diǎn):微軟提供的控件都是令我們不夠滿意的,我們得自己重寫(xiě)這些控件類,也就是繼承他!(記得保存下來(lái)以后再用哦)。
講到這里,這個(gè)即時(shí)聊天軟件的主要思想也介紹差不多了。提幾點(diǎn)軟件開(kāi)發(fā)的體會(huì),要注意代碼的編寫(xiě)習(xí)慣,不要寫(xiě)那么多全局變量和外部變量(不到比不得以的話),注意內(nèi)存的釋放防止泄露,調(diào)試能力很重要(否則很多時(shí)候看卡你怎么不知所措)。
【牛人編寫(xiě)聊天工具的心得】相關(guān)文章:
教材編寫(xiě)心得體會(huì)09-05
編寫(xiě)童話作文11-19
編寫(xiě)童話的作文05-12
編寫(xiě)童話作文02-07
如何規(guī)范編寫(xiě)教案08-24
關(guān)于編寫(xiě)童話的作文02-21
咱班的牛人作文01-12
班里的牛人作文02-15
編寫(xiě)會(huì)議記錄的心得總結(jié)(通用10篇)11-21
編寫(xiě)童話故事作文02-04