![畢業(yè)論文-局域網(wǎng)聊天軟件設(shè)計與實現(xiàn)_第1頁](http://file4.renrendoc.com/view/bd46bd222761617b904385ec1e3ad820/bd46bd222761617b904385ec1e3ad8201.gif)
![畢業(yè)論文-局域網(wǎng)聊天軟件設(shè)計與實現(xiàn)_第2頁](http://file4.renrendoc.com/view/bd46bd222761617b904385ec1e3ad820/bd46bd222761617b904385ec1e3ad8202.gif)
![畢業(yè)論文-局域網(wǎng)聊天軟件設(shè)計與實現(xiàn)_第3頁](http://file4.renrendoc.com/view/bd46bd222761617b904385ec1e3ad820/bd46bd222761617b904385ec1e3ad8203.gif)
![畢業(yè)論文-局域網(wǎng)聊天軟件設(shè)計與實現(xiàn)_第4頁](http://file4.renrendoc.com/view/bd46bd222761617b904385ec1e3ad820/bd46bd222761617b904385ec1e3ad8204.gif)
![畢業(yè)論文-局域網(wǎng)聊天軟件設(shè)計與實現(xiàn)_第5頁](http://file4.renrendoc.com/view/bd46bd222761617b904385ec1e3ad820/bd46bd222761617b904385ec1e3ad8205.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、 緒論1.1 課題背景隨著信息化的廣泛普及,網(wǎng)絡(luò)這種新興事物在今年來得到前所未有的普及和發(fā)展,基于網(wǎng)絡(luò)的各種應(yīng)用層出不窮,讓各個年齡及階層的用戶體會到了不同的個性化服務(wù),人們的生活方式已經(jīng)與網(wǎng)絡(luò)緊密的結(jié)合在一起。中小型企業(yè)的領(lǐng)導(dǎo)也認識到提高企業(yè)信息化的必要性,為了讓企業(yè)在發(fā)展迅速的信息時代生存下去,增強企業(yè)的競爭力,就要求有一個良好的平臺來讓企業(yè)員工之間的交流和通信,特別是領(lǐng)導(dǎo)和員工之間的溝通與交流,因此即時聊天交流系統(tǒng)就應(yīng)運而生。伴隨著企業(yè)規(guī)模的不斷擴大,企業(yè)的各種信息也越來越私密,企業(yè)只希望員工通過內(nèi)部網(wǎng)絡(luò)進行交流與溝通,最大限度避免機密信息通過Internet泄漏到外部。為了解決上述問題
2、,從而提出了局域網(wǎng)聊天軟件的構(gòu)想,通過該軟件,企業(yè)的員工可以隨時進行消息傳遞,即提高了效率,又保護了信息的私密與安全性。軟件開發(fā)是一個十分復(fù)雜的過程,這里對軟件開發(fā)的基本過程和方法進行介紹,并列舉相關(guān)的實例加以說明。1.2 目的和意義本論文主要說明基于Linux平臺的局域網(wǎng)聊天軟件的設(shè)計與實現(xiàn)。詳細闡述開發(fā)中所用到的相關(guān)技術(shù),并具體分析各個模塊的功能和實現(xiàn)方法。本軟件能夠滿足小型企業(yè)或小型局域網(wǎng)內(nèi)部即時通信的需要,提高工作效率。1.3 研究現(xiàn)狀1996年11月,出現(xiàn)了ICQ,于是第一款互聯(lián)網(wǎng)IM(Instant Messenger,即時通訊)應(yīng)運而生,隨后短短數(shù)年里成為了一個巨大的IM產(chǎn)業(yè)。到
3、現(xiàn)在,IM應(yīng)用工具成為了最熱門的網(wǎng)絡(luò)應(yīng)用之一。國內(nèi)各種外聊天工具花樣繁多。而作為全球第一款即時通訊工具的ICQ,經(jīng)過不斷的發(fā)展,如今在業(yè)內(nèi)的地位已經(jīng)無人能夠撼動。ICQ名字是英文“I seek you”的縮寫,即“我找你”。ICQ最初只有兩個特性,一個是用戶列表,另一個是即時聊天。但是一出世就收到網(wǎng)民的喜愛,半年里注冊用戶就達到了85萬,1998年這個數(shù)字更是翻了14多倍,注冊用戶達到了1200多萬人。ICQ的迅速發(fā)展也讓在桌面軟件領(lǐng)域獨步天下的微軟與互聯(lián)網(wǎng)領(lǐng)頭羊的Yahoo嗅到了商機,分別推出了MSN與Yahoo Messenger,形成了即時通訊市場的雛形。ICQ風(fēng)行全球的時候,國內(nèi)也推出
4、了各種仿ICQ的中文IM工具,現(xiàn)在國內(nèi)的市場主要有微軟的MSN、騰訊的QQ、雅虎的雅虎通等等。騰訊的QQ占據(jù)國內(nèi)市場的70%以上。隨著IM應(yīng)用的發(fā)展,其功能也不斷的豐富,除了用戶列表與即時聊天,表情圖片也成為了它的一個重要特性,此外文件傳輸、視頻聊天、游戲等功能也被集成到了IM應(yīng)用中。如今,IM不是一個簡單的聊天工具,而是一個集信息資訊、休閑娛樂、交流互動的平臺,它上面的語音、音樂點播、視頻、信息共享等新的應(yīng)用層出不窮。隨著IM應(yīng)用的不斷成熟,已經(jīng)形成了IM產(chǎn)業(yè)鏈。IM應(yīng)用也成為了現(xiàn)代人們與現(xiàn)代經(jīng)濟中不可缺少的一部分。互聯(lián)網(wǎng)技術(shù)的發(fā)展使信息在傳遞方面也有了嶄新的一面。聊天軟件成為了信息傳遞最重
5、要的方式,它可以讓人們隨時隨地進行信息交流,讓人們更好的了解彼此。聊天軟件人性化的設(shè)計可以讓每個用戶都能得心應(yīng)手的使用,獲得了更多人的青睞。Internet的出現(xiàn)讓整個世界連通起來,而聊天軟件的出現(xiàn)把每一位網(wǎng)上的用戶聯(lián)通起來。網(wǎng)絡(luò)應(yīng)用的不斷發(fā)展,讓聊天軟件成為最熱門的應(yīng)用之一。經(jīng)過進來的發(fā)展,聊天軟件已不再是簡單的通訊工具,而是成為集互動交流、休閑娛樂為一體的多元化的互聯(lián)網(wǎng)應(yīng)用平臺,它的出現(xiàn)給人們彼此間的溝通帶來了無比的方便,通過聊天軟件人們可以建立深刻的友情,讓聊天軟件更加充滿了活力與生機。 2 系統(tǒng)分析2.1 系統(tǒng)理論基礎(chǔ)2.1.1 C/S架構(gòu)C/S結(jié)構(gòu)的基本原則是將計算機的應(yīng)用任務(wù)分解成
6、多個子任務(wù),由多臺計算機分工合作完成。Client端完成數(shù)據(jù)的處理,數(shù)據(jù)的表示及用戶接口功能;Server端完成DBMS的核心功能。這種架構(gòu)的優(yōu)點是具有強大的事務(wù)處理與數(shù)據(jù)操作能力,開發(fā)的模型比較簡單,易于人們接受和理解。系統(tǒng)的應(yīng)用程序和服務(wù)器構(gòu)建在不同的計算機上運行。在C/S架構(gòu)中,各個構(gòu)建能夠充分隔離,應(yīng)用程序的開發(fā)集中于數(shù)據(jù)的瀏覽與查詢,數(shù)據(jù)庫服務(wù)器開發(fā)集中于數(shù)據(jù)的管理功能,有利于系統(tǒng)的安全性。服務(wù)器與客戶端直接相連,實時性良好。可以充分發(fā)揮客戶端的處理能力,可以在客戶端把一部分工作處理后在提交給服務(wù)器??蛻舳说捻憫?yīng)速度快并且應(yīng)用服務(wù)器運行數(shù)據(jù)的負荷也比較輕。缺點一是應(yīng)用服務(wù)器的運行數(shù)據(jù)
7、負荷較輕。最簡單的C/S架構(gòu)的數(shù)據(jù)應(yīng)用有兩個部分,即客戶應(yīng)用程序與數(shù)據(jù)庫服務(wù)器程序,可以分別稱作前臺程序和后臺程序。后臺程序運行數(shù)據(jù)庫服務(wù)器程序,服務(wù)器一旦啟動,就隨時等待響應(yīng)前臺程序發(fā)來的請求;前臺程序運行在用戶的電腦上,當(dāng)前臺程序要對數(shù)據(jù)庫中的數(shù)據(jù)進行任何操作時,就自動尋找后臺程序,發(fā)送請求,后臺程序根據(jù)預(yù)定的規(guī)則做出應(yīng)答。二是數(shù)據(jù)的存儲管理功能比較透明,在數(shù)據(jù)庫中,數(shù)據(jù)的存儲管理,是由服務(wù)器與客戶端分別進行的,客戶端不能違反的規(guī)則是在服務(wù)器中體現(xiàn)的。對于客戶端是透明的,客戶端無法干涉背后的過程。在這種架構(gòu)下,數(shù)據(jù)庫不能成為真正公共的、專業(yè)化的倉庫,要受到專門的管理。2.1.2 TCPTC
8、P協(xié)議即TCP傳輸控制協(xié)議,是一種面向連接的、可靠的傳輸層協(xié)議,是專門為廣域網(wǎng)設(shè)計的。它的標(biāo)準(zhǔn)是在一系列稱為RFC的文檔中。TCP是面向連接的,所以通信雙方在通信之前必須先建立TCP連接,通信結(jié)束之后必須斷開TCP連接。TCP的可靠性通過下列方式來體現(xiàn):(1)把應(yīng)用數(shù)據(jù)分割成最適合TCP發(fā)送的數(shù)據(jù)塊。保持應(yīng)用程序產(chǎn)生的數(shù)據(jù)長度不變。報文段或段(segment)是由TCP傳遞給IP的信息單位。(2)TCP發(fā)出一個段后,都啟動一個定時器,等待接受目的端確認收到這個段。如果不能及時收到目的端的確認,TCP將重發(fā)這個段。如果TCP收到發(fā)送端的數(shù)據(jù),將發(fā)送一個確認。(3)TCP保持它首部和數(shù)據(jù)的檢驗和。
9、它是一個端到端的檢驗和,是為了檢測數(shù)據(jù)在傳輸過程中是否變化。如果接受到的段的檢驗和有差錯,則TCP將丟棄這個報文段并不發(fā)送確認(希望發(fā)端超時并重發(fā))。(4)TCP報文段是作為IP數(shù)據(jù)報來傳輸?shù)?,而IP數(shù)據(jù)報可能會失序,因此TCP報文段也可能會失序。所以,TCP將對收到的數(shù)據(jù)進行重新排序,然后將正確的順序交給應(yīng)用層。(5)IP數(shù)據(jù)報會發(fā)生重復(fù),所以必須丟棄TCP接收端重復(fù)的數(shù)據(jù)。(6)TCP提供流量控制功能。TCP連接的雙方都有固定大小的緩沖空間。TCP接收端只允許TCP發(fā)送端發(fā)送TCP接收端緩沖區(qū)所能接納的數(shù)據(jù)。TCP使用三次握手協(xié)議建立連接,下圖就是三次握手建立連接的過程。圖2-1 TCP三
10、次握手示意圖首先客戶端發(fā)送SYN(SEQ=x)報文給服務(wù)器端,并進入SYN_SEND狀態(tài)。其次服務(wù)器端收到SYN報文后回應(yīng)一個SYN(SEQ=y)ACK(ACK=x+1)的報文,并進入HYPERLINK /view/1520054.htmSYN_RECV狀態(tài)。最后客戶端收到服務(wù)器端的SYN報文并回應(yīng)一個ACK(ACK=y+1)報文,然后進入Established狀態(tài)。TCP經(jīng)過四次握手終止連接,下圖就是四次握手終止連接的過程:圖2-2 TCP鏈接釋放示意圖首先應(yīng)用進程調(diào)用close函數(shù),稱該端執(zhí)行“主動關(guān)閉”(active close)操作。于是該端的TCP發(fā)送一個FIN分節(jié)以表示數(shù)據(jù)發(fā)送完畢
11、。接著接收到這個FIN的對端執(zhí)行 “被動關(guān)閉”(passive close)操作。一段時間后接收到這個文件結(jié)束符的應(yīng)用進程將調(diào)用close函數(shù)關(guān)閉它的套接字,該段的TCP也發(fā)送一個FIN。最后接收這個最終FIN的原發(fā)送端TCP確認這個FIN。2.1.3 SocketSocket接口是TCP/IP網(wǎng)絡(luò)的API,Socket接口定義了許多函數(shù)或例程2,程序員可以用它們來開發(fā)TCP/IP網(wǎng)絡(luò)上的應(yīng)用程序。要學(xué)的TCP/IP網(wǎng)絡(luò)編程,必須理解Socket接口,Socket(套接字)是BSD提供的網(wǎng)絡(luò)應(yīng)用編程接口,現(xiàn)在它已經(jīng)是網(wǎng)絡(luò)編程中的標(biāo)準(zhǔn)。據(jù)傳輸?shù)炔僮鞫际峭ㄟ^該Socket實現(xiàn)的。常用的Socket
12、類型有兩種:流式Socket (SOCK_STREAM)和數(shù)據(jù)報式Socket(SOCK_DGRAM)。流式是一種面向連接的Socket,針對于面向連接的TCP服務(wù)應(yīng)用;數(shù)據(jù) 報式Socket是一種無連接的Socket,對應(yīng)于無連接的UDP服務(wù)應(yīng)用。Linux系統(tǒng)中的網(wǎng)絡(luò)編程通過Socket接口實現(xiàn)。Socket既是一種特殊的IO,它也是一種文件描述符。一個完整的Socket都有一個相關(guān)描述協(xié)議,本地地址,本地端口,遠程地址,遠程端口;每一個Socket有一個本地的唯一Socket號,由操作系統(tǒng)分配。為了建立Socket,程式能夠調(diào)用Socket函數(shù),該函數(shù)返回一個類似于文檔描述符的句柄。so
13、cket函數(shù)原型為: int socket(int family, int type, int protocol); #include 參數(shù)說明:family:協(xié)議族 AF_INET,AF_INET6,AF_LOCAL,AF_ROUTE,AF_KEY type:套接字類型 SOCK_STREAM,SOCK_DGRAM,SOCK_RAW ,SOCK_SEQPACKET protocol:協(xié)議類別 0,IPPROTO_TCP,IPPROTO_UDP,IPPROTO_SCTP 返回值:套接字 通過socket調(diào)用返回一個socket描述符后,在使用socket進行網(wǎng)絡(luò)傳輸以前,必須配置該socket
14、。面向連接的socket客戶端通過調(diào)用Connect函數(shù)在socket數(shù)據(jù)結(jié)構(gòu)中保存本地和遠端信息。無連接socket的客戶端和服務(wù)端連同面向連接socket的bind函數(shù)將一個地址綁定到套接字 int bind(int sockfd, const struct sockaddr *myaddr, socklen_t addrlen); #include sockfd: socket套接字描述符 myaddr: 指向特定于協(xié)議的地址結(jié)構(gòu)指針 addrlen:該地址結(jié)構(gòu)的長度 返回值:0,成功;其他,失敗 struct sockaddr結(jié)構(gòu)類型是用來保存socket信息的:#include st
15、ruct sockaddr unsigned short sa_family; /*地址族,AF_xxx */ char sa_data14; /* 14字節(jié)的協(xié)議地址*/;sa_family一般為AF_INET,代表Internet(TCP/IP)地址族;sa_data則包含該socket的IP地址和端口號。struct sockaddr_in /后面編程也會用到的結(jié)構(gòu)體short int sin_family; /*地址族*/unsigned short int sin_port; /*端口號*/struct in_addr sin_addr; /* IP地址*/unsigned char
16、 sin_zero8; /*填充0以保持和struct sockaddr同樣大小*/; 使用一個確知的端口來接收客戶端的連接。bind函數(shù)將一個地址綁定到套接字 #include int bind(int sockfd, const struct sockaddr *myaddr, socklen_t addrlen); sockfd: socket套接字描述符 myaddr: 指向特定于協(xié)議的地址結(jié)構(gòu)指針 addrlen:該地址結(jié)構(gòu)的長度 返回值:0,成功;其他,失敗 建立連接與收發(fā)數(shù)據(jù)。int listen(int sockfd, int backlog); listen函數(shù)可以將套接字由
17、主動修改為被動,操作系統(tǒng)為該套接字設(shè)置一個連接隊列,來記錄所有連接到該套接字的連接 。sockfd: socket監(jiān)聽套接字描述符 backlog:連接隊列的長度int accept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen);accept函數(shù)從已連接隊列中取出一個已經(jīng)建立的連接int connect(int sockfd, const struct sockaddr *addr, socklen_t len);connect 主動連接addr中的監(jiān)聽套接字。ssize_t send(int sockfd, const v
18、oid *buf, size_t nbytes, int flags);/發(fā)送數(shù)據(jù)ssize_t recv(int sockfd, void *buf, size_t nbytes, int flags);/接受數(shù)據(jù)以上是對socket編程的一些主要函數(shù)進行介紹,接下來的編程中就會用到這些函數(shù)。2.1.4 QT編程框架QT是一個跨平臺的C+ GUI應(yīng)用框架,它給應(yīng)用程序開發(fā)者提供建立友好的圖形用戶界面所需要的所有功能。QT具有面向?qū)ο蟆⒄嬲慕M件編程、易于擴展的特點。QT的核心機制是信號和槽。信號和槽是QT的一種高級接口,主要應(yīng)用于對象之間的通信。它是QT自定義的一種通信機制,獨立于標(biāo)準(zhǔn)的C/
19、C+語言,使用QT的信號和槽,就必須借助一個QT的工具moc,moc是一個C+預(yù)處理器,為高層次的事件處理自動生成附加代碼。信號是對象發(fā)射出來的,并且只有定義過該信號的類及其派生類才能發(fā)射出這個信號。當(dāng)發(fā)射一個信號時,與信號相關(guān)聯(lián)的槽函數(shù)將被立刻執(zhí)行。信號和槽機制獨立于任何GUI時間循環(huán)。只有所有的槽函數(shù)返回后發(fā)射函數(shù)才返回。如果多個槽函數(shù)與一個信號相關(guān)聯(lián),當(dāng)該信號被發(fā)射時,槽函數(shù)會一個接一個的執(zhí)行,但是它們的執(zhí)行順序是隨機的。不能人為的指定哪個槽函數(shù)先執(zhí)行,哪個槽函數(shù)后執(zhí)行。信號是在頭文件中聲明的,QT用signals 關(guān)鍵字來標(biāo)識信號聲明區(qū)。槽函數(shù)是普通的C+成員函數(shù),唯一不同的就是它可以
20、與很多信號相關(guān)聯(lián)。當(dāng)產(chǎn)生與其相關(guān)聯(lián)的信號時,就會被調(diào)用該槽函數(shù)。通過調(diào)用QObject對象的connect()函數(shù)來將信號與槽函數(shù)相關(guān)聯(lián)。這個函數(shù)的作用是將發(fā)射者對象中的信號與接受者的槽函數(shù)聯(lián)系起來。用QT的宏SIGNAL()來指定信號,用宏SLOT()來指定槽函數(shù)。信號和槽機制雖然比較靈活,但是也有一些局限性。為了避免在實際的使用過程中產(chǎn)生一些錯誤,做到有的放矢。應(yīng)注意下面的一些注意事項:(1)和真正的回調(diào)函數(shù)比起來,信號和槽在效率上有所損失,但是這種損失相對來說是比較小的。它提供的靈活性、簡潔性還是值得的。但如果要追求高效率的華,比如實時系統(tǒng),就要盡可能少用這種機制。(2)信號和槽函數(shù)機制
21、和普通的函數(shù)的調(diào)用一樣,要是使用不當(dāng)?shù)脑挘诔绦蜻\行過程中可能發(fā)生死循環(huán)。所以,在使用槽函數(shù)是一定要注意,防止形成死循環(huán),如在槽函數(shù)中發(fā)射所接收到的信號。(3)當(dāng)一個信號與多個槽函數(shù)相聯(lián)系時,當(dāng)該信號發(fā)射后,相應(yīng)的槽函數(shù)的執(zhí)行順序?qū)⑹请S機的。(4)在signal和slot函數(shù)的參數(shù)中不能使用宏定義。這是由于moc工具不擴展#define。(5)不能在signals或者slots區(qū)域內(nèi)聲明構(gòu)造函數(shù)。(6)信號或槽函數(shù)的參數(shù)不能是函數(shù)指針。但是可以通過定義別名來繞過這個限制。(7)信號和槽函數(shù)不能有缺省參數(shù)。(8)信號和槽函數(shù)不能攜帶帶模版類的參數(shù),如果這樣使用的話,即時moc工具不報告發(fā)生錯誤,
22、也得不到想要的結(jié)果。但是,可以通過定義別名來繞過這個限制。(9)信號或槽函數(shù)區(qū)域內(nèi)不能包含嵌套的類,嵌套的類中也不能有信號或者槽函數(shù)。(10)最后信號或槽函數(shù)區(qū)域內(nèi)也不能聲明友元。Qt提供了一組范圍相當(dāng)廣泛的C+類庫,并包含了幾種命令行和圖形界面的工具,有效地使用這些工具可以加速開發(fā)過程。Qt Designer:Qt設(shè)計器。用來可視化地設(shè)計應(yīng)用程序界面。Qt Linguist:Qt語言學(xué)家。用來翻譯應(yīng)用程序。以此提供對多種語言的支持。Qmake:使用此工具可以由簡單的、與平臺無關(guān)的工程文件來生成編譯所需的Makefile。Qt Assistant:關(guān)于Qt的幫助文件。類似于MSDN。可以快速地
23、發(fā)現(xiàn)你所需要的幫助。moc:元對象編譯器。uic:用戶界面編譯器。在程序編譯時被自動調(diào)用,通過ui_*.h文件生成應(yīng)用程序界面。qembed:轉(zhuǎn)換數(shù)據(jù),比如,將圖片轉(zhuǎn)換為C+代碼。安裝的過程對于不同的Qt平臺是不同的。在Windows環(huán)境下安裝Qt,需要先安裝MinGW。MinGW,即Minimalist GNU For Windows。它是一些頭文件和端口庫的集合,該集合允許人們在沒有第三方動態(tài)鏈接庫的情況下使用 GCC(GNU Compiler C)產(chǎn)生 Windows32 程序。在基本層,MinGW是一組包含文件和端口庫,其功能是允許控制臺模式的程序使用微軟的標(biāo)準(zhǔn)C運行時間庫(MSVCR
24、T.DLL),該庫在所有的 NT OS 上有效,在所有的 Windows 95 發(fā)行版以上的 Windows OS有效,使用基本運行時間,你可以使用 GCC 寫控制臺模式的符合美國標(biāo)準(zhǔn)化組織(ANSI)程序,可以使用微軟提供的 C 運行時間擴展。該功能是 Windows32 API 不具備的。下一個組成部分是 w32api 包,它是一組可以使用 Windows32 API的包含文件和端口庫。與基本運行時間相結(jié)合,就可以有充分的權(quán)利既使用 CRT(C Runtime)又使用 Windows32 API 功能。實際上 MinGW 并不是一個 C/C+編譯器,而是一套 GNU 工具集合。除開 GCC
25、 (GNU 編譯器集合) 以外,MinGW 還包含有一些其他的 GNU 程序開發(fā)工具 (比如 gawk bison 等等)。在安裝MinGW之后,再安裝Qt,然后更改一下Windows系統(tǒng)的環(huán)境變量,就可以在Windows環(huán)境下使用Qt了。如果想在VC環(huán)境下使用Qt,那么還需要進一步編譯和設(shè)置,或者下載專門用于VC的QT版本。一個布局管理者就是一個根據(jù)窗口作用設(shè)置其大小和位置的對象。Qt有三個主要的布局管理類:QHBoxLayout:將窗口部件水平自左至右設(shè)置(有些情況下是自右向左)。QVBoxLayout:將窗口部件垂直自上向下設(shè)置。QGridLayout: 以網(wǎng)格形式設(shè)置窗口部件。Qt構(gòu)建
26、用戶界面的方法很容易理解,并且有很高的靈活性。Qt程序員最常用的設(shè)計模式是:說明所需要的窗口部件,然后設(shè)置這些部件必須的特性。程序員把窗口部件添加到布局管理器中,布局管理器就將自動地設(shè)置這些部件的大小和位置。而用戶界面的行為是通過連接各個部件(運用信號/槽機制)來實現(xiàn)的?!靶盘柡筒邸睓C制用于Qt對象間的通訊?!靶盘?槽”機制是一種關(guān)于無縫對象通訊的機制,它是Qt的一個中心特征,也是Qt與其它工具包的最不相同的部分。在圖形用戶界面編程中,我們經(jīng)常希望一個窗口部件的一個變化被通知給另一個窗口部件。更一般地,我們希望任何一類的對象可以和其它對象進行通訊。例如,如果我們正在解析一個XML文件,當(dāng)我們遇
27、到一個新的標(biāo)簽時,我們也許希望通知列表視圖我們正在用來表達XML文件的結(jié)構(gòu)。較老的工具包使用一種被稱作回調(diào)(callback)的通訊方式來實現(xiàn)同一目的?;卣{(diào)是指一個函數(shù)的指針,如果你希望一個處理函數(shù)通知你一些事件,你可以把另一個函數(shù)(回調(diào))的指針傳遞給處理函數(shù)。處理函數(shù)在適當(dāng)?shù)臅r候調(diào)用回調(diào)?;卣{(diào)有兩個主要缺點:首先他們不是類型安全的。我們從來都不能確定處理函數(shù)使用了正確的參數(shù)來調(diào)用回調(diào)。其次回調(diào)和處理函數(shù)是非常強有力地聯(lián)系在一起的,因為處理函數(shù)必須知道要調(diào)用哪個回調(diào)。 在Qt中我們有一種可以替代回調(diào)的技術(shù)。我們使用信號和槽。當(dāng)一個特定事件發(fā)生的時候,一個信號被發(fā)射。Qt的窗口部件有很多預(yù)定義的
28、信號,但是我們總是可以通過繼承來加入我們自己的信號。槽就是一個可以被調(diào)用處理特定信號的函數(shù)。Qt的窗口部件也有很多預(yù)定義的槽,但是通常的習(xí)慣是你可以加入自己的槽,這樣你就可以處理你所感興趣的信號?!靶盘柡筒邸钡臋C制是類型安全的:一個信號的簽名必須與它的接收槽的簽名相匹配(實際上一個槽的簽名可以比它接收的信號的簽名少,因為它可以忽略額外的簽名)。因為簽名是一致的,編譯器就可以幫助我們檢測類型不匹配。信號和槽是寬松地聯(lián)系在一起的:一個發(fā)射信號的類不用知道也不用注意哪個槽要接收這個信號。Qt的“信號和槽”的機制可以保證如果你把一個信號和一個槽連接起來,槽會在正確的時間使用信號的參數(shù)而被調(diào)用。信號和槽
29、可以使用任何數(shù)量、任何類型的參數(shù)。它們是完全類型安全的:不會再有回調(diào)核心轉(zhuǎn)儲(core dump)。從 HYPERLINK /qt/qobject.html QObject類,或者它的一個子類(比如 HYPERLINK /qt/qwidget.html QWidget類)所繼承出的所有類,都可以包含信號和槽。當(dāng)對象改變它們的狀態(tài)的時候,信號被發(fā)送,這就是所有的對象通訊時所做的一切。它不執(zhí)導(dǎo)也不注意有沒有對象接收它所發(fā)射的信號。槽用來接收信號,但它們同時也是對象中正常的成員函數(shù)。一個槽不知道它是否被任意信號連接。此外,對象并不知道關(guān)于這種通訊的機制。你可以把很多信號和你所希望的單一槽相連,并且一
30、個信號也可以和你所期望的許多槽相連。把一個信號和另外一個信號直接相連也是可行的(這種情況下,只要第一個信號被發(fā)射,第二個信號就會被立即發(fā)射)。信號:當(dāng)對象的內(nèi)部狀態(tài)發(fā)生改變,信號就被發(fā)射,只有定義了一個信號的類和它的子類才能發(fā)射這個信號。例如,一個列表框同時發(fā)射highlighted()和activated()這兩個信號。絕大多數(shù)對象也許只對activated()這個信號感興趣,但是有時我們也想知道列表框中的哪個條目在當(dāng)前是高亮的。如果兩個不同的類對同一個信號感興趣,你可以把這個信號和這兩個對象連接起來。 當(dāng)一個信號被發(fā)射,它所連接的槽會被立即執(zhí)行,就像一個普通函數(shù)調(diào)用一樣。信號/槽機制完全不
31、依賴于任何一種圖形用戶界面的事件回路。當(dāng)所有的槽都返回后 emit也將返回。 如果幾個槽被連接到一個信號,當(dāng)信號被發(fā)射時,這些槽就會被按任意順序一個接一個地執(zhí)行。 信號會由 HYPERLINK /qt/moc.html l moc moc自動生成并且一定不要在.cpp文件中實現(xiàn)。它們也不能有任何返回類型(比如使用void)。 關(guān)于參數(shù)需要注意。我們的經(jīng)驗顯示如果信號和槽不使用特殊的類型,它們都可以多次使用。如果QScrollBar:valueChanged() 使用了一個特殊的類型,比如hypothetical QRangeControl:Range,它就只能被連接到被設(shè)計成可以處理 QRan
32、geControl的槽。槽:當(dāng)一個和槽連接的信號被發(fā)射的時候,這個操被調(diào)用。槽也是普通的C+函數(shù)并且可以像它們一樣被調(diào)用;它們唯一的特點就是它們可以被信號連接。槽的參數(shù)不能含有默認值,并且和信號一樣,為了槽的參數(shù)而使用自己特定的類型是很不明智的。因為槽就是普通成員函數(shù),但卻有一點非常有意思的東西,它們也和普通成員函數(shù)一樣有訪問權(quán)限。一個槽的訪問權(quán)限決定了誰可以和它相連:一個public slots:區(qū)包含了任何信號都可以相連的槽。這對于組件編程來說非常有用:你生成了許多對象,它們互相并不知道,把它們的信號和槽連接起來,這樣信息就可以正確地傳遞,并且就像一個鐵路模型,把它打開然后讓它跑起來。一個
33、protected slots:區(qū)包含了之后這個類和它的子類的信號才能連接的槽。這就是說這些槽只是類的實現(xiàn)的一部分,而不是它和外界的接口。 一個private slots:區(qū)包含了之后這個類本身的信號可以連接的槽。這就是說它和這個類是非常緊密的,甚至它的子類都沒有獲得連接權(quán)利這樣的信任。你也可以把槽定義為虛的,這在實踐中被發(fā)現(xiàn)也是非常有用的。Qt的一個最主要的特點可能就是它擴展了C+的機制,可以創(chuàng)建獨立的軟件組件,這些組件可以被綁定在一起,而不需要互相的任何了解。這個機制被成為元對象系統(tǒng),它提供了兩個關(guān)鍵服務(wù):信號/槽、運行時的類型信息和動態(tài)屬性系統(tǒng)(內(nèi)省機制)。內(nèi)省機制對于實現(xiàn)信號和槽是必須
34、的,并且允許應(yīng)用程序員在程序運行時獲得“元信息”(包括被對象支持的信號和槽的列表,以及這些信號/槽所在的類的名稱)。內(nèi)省機制同時支持“道具”(對于Qt Designer)和文本翻譯(國際化),它還是Qt應(yīng)用程序腳本(Qt Script for Application)的基礎(chǔ)。標(biāo)準(zhǔn)的C+并不提供對于Qt的元對象系統(tǒng)所需要的動態(tài)元信息的支持。Qt提供了一個單獨的工具:元對象編譯器(moc)來解決這個問題。Moc用來解析Q_OBJECT類的定義,使這些信息在C+函數(shù)中可用。由于moc使用純粹的C+函數(shù)來實現(xiàn),所以Qt的元對象系統(tǒng)在任何C+編譯器下都可以工作。元對象系統(tǒng)這樣工作:Q_OBJECT宏聲明
35、一些內(nèi)省函數(shù)(metaObject(),TR(),qt_matacall()和少量其他的函數(shù))。這些函數(shù)必須在所有的QObject的子類中被實現(xiàn)。Qt的moc工具負責(zé)執(zhí)行被Q_OBJECT宏聲明的函數(shù),同時負責(zé)執(zhí)行所有的信號函數(shù)。QObject的成員函數(shù),例如connect()和disconnect(),使用內(nèi)省函數(shù)來工作。元對象系統(tǒng)基于以下三類:1)、QOBJECT類;2)、類聲明中的私有段的Q_OBJECT宏;3)、元對象編譯器。Moc讀取C+源文件。如果它發(fā)現(xiàn)其中包含一個或多個類的聲明中含有Q_OBJECT宏,它就會給含有Q_OBJECT宏的類生成另一個含有元對象代碼的C+源文件。這個生
36、成的源文件可以被類的源文件包含(#include)到或者和這個類的實現(xiàn)一起編譯和連接。除了提供對象間通訊的信號和槽機制之外(這也是介紹這個系統(tǒng)的主要原因),QObject中的元對象代碼也實現(xiàn)其它特征:1)、className()函數(shù)在運行的時候以字符串返回類的名稱,不需要C+編譯器中的運行時刻類型識別(RTTI)的支持。2)、inherits()函數(shù)返回這個對象是否是一個繼承于QObject繼承樹中一個特定類的類的實例。3)、tr()和trUtf8()兩個函數(shù)是用于國際化的字符串翻譯。4)、setPorperty()和property()兩個函數(shù)是用來通過名稱動態(tài)設(shè)置和獲得對象屬性的。5)、m
37、etaObject()函數(shù)返回這個類所關(guān)聯(lián)的元對象。雖然使用QObject作為一個基類而不使用Q_OBJECT宏和元對象代碼是可以的,但是如果Q_OBJECT宏沒有被使用,那么這里的信號和槽以及其它特征描述都不會被提供。根據(jù)元對象系統(tǒng)的觀點,一個沒有元代碼的QObject的子類和它含有元對象代碼的最近的祖先相同。舉例來說就是,className()將不會返回你的類的實際名稱,返回的是它的這個祖先的名稱。我們強烈建議QObject的所有子類使用Q_OBJECT宏,而不管它們是否實際使用了信號、槽和屬性。2.2 可行性研究設(shè)計局域網(wǎng)聊天軟件需要基于具有TCP/IP協(xié)議棧的Linux操作系統(tǒng)。軟件采
38、用TCP協(xié)議作為基本通信協(xié)議,并自己構(gòu)造應(yīng)用層數(shù)據(jù)結(jié)構(gòu)。軟件通過Socket套接字實現(xiàn)客戶端與服務(wù)器之間連接的建立。在Linux系統(tǒng)中Socket套接字可以用文件的形式進行操作,所以,客戶端與服務(wù)器之間數(shù)據(jù)的讀寫完全可以通過Linux系統(tǒng)文件的讀寫操作來實現(xiàn),軟件采用QT編程框架,提供了圖形用戶界面應(yīng)用程序的開發(fā)框架,所以經(jīng)分析該軟件設(shè)計基本可行。2.3 需求分析本項目基于Linux系統(tǒng)實現(xiàn)在局域網(wǎng)內(nèi)的聊天軟件,軟件分為服務(wù)端和客戶端,要實現(xiàn)的功能如下。服務(wù)器端:(1)能夠正確的啟動服務(wù)器。(2)能夠監(jiān)聽指定的端口,來等待用戶的連接。(3)客戶端注冊時能通過數(shù)據(jù)庫驗證用戶的注冊信息,并把注冊結(jié)
39、果返回給客戶端。(4)客戶端登陸時能通過數(shù)據(jù)庫驗證用戶的登陸信息,登陸成功后,把此用戶的登錄消息通知其他好友。(5)登陸成功時,能夠向新連接的用戶發(fā)送已上線的用戶名單。(6)能夠接收客戶端的群聊消息請求,并能正確無誤地處理請求,并把消息發(fā)送到所有已登錄的客戶端。(7)能夠接受客戶端的私聊消息請求,并能正確無誤地處理請求,并把消息發(fā)送到特定的客戶端。(8)當(dāng)用戶斷開與服務(wù)器端地連接時,服務(wù)器能夠把連接正確的斷開,并把該用戶退出的消息通知其他用戶。(9)能夠正確的關(guān)閉服務(wù)器。客戶端:(1)能夠啟動應(yīng)用程序,并與服務(wù)器建立連接。(2)登陸界面,能夠把登錄信息正確的發(fā)送到服務(wù)器。(3)能夠正確的處理服
40、務(wù)器反饋的登結(jié)果信息。(4)注冊界面,能夠把注冊信息正確的發(fā)送到服務(wù)器。(5)能夠正確的處理服務(wù)器反饋的注冊結(jié)果信息。(6)登錄以后,能夠自動的更新用戶列表。(7)能夠把群聊消息正確的發(fā)送到服務(wù)器。(8)能夠正確的把群聊消息顯示到群聊界面。(9)能夠把私聊消息正確的發(fā)送到服務(wù)器。(10)能夠正確的把私聊消息顯示到特定的聊天窗口。(11)客戶端退出時,能夠把該用戶的退出消息發(fā)送到服務(wù)器,并關(guān)閉所有聊天窗口。2.4 系統(tǒng)運行環(huán)境硬件環(huán)境:CPU:Inter(R) Core(TM) i5 2.67GHz內(nèi)存:2.00 GB硬盤:500 G軟件環(huán)境:操作系統(tǒng):Ubuntu 12.0.4應(yīng)用軟件:QT
41、5.0.23 系統(tǒng)設(shè)計3.1 系統(tǒng)結(jié)構(gòu)設(shè)計本系統(tǒng)采用C/S結(jié)構(gòu),最重要的特點是非對相互作用,即客戶與服務(wù)器處于不平等的地位,服務(wù)器擁有客戶所不具備的軟硬件資源,客戶與服務(wù)器分別是服務(wù)的請求者和提供者。網(wǎng)絡(luò)中各個及其的資源是不平等的,網(wǎng)絡(luò)的真正目的就是共享這些不均等資源,非對等相互作用特點也正好體現(xiàn)和適應(yīng)了客觀現(xiàn)實中資源不均等現(xiàn)象。局域網(wǎng)上不同主機進程間通信完全是異步的,通信時機具有隨機性,所以必須用這種為通信雙方的數(shù)據(jù)交換提供同步的機制。3.2 客戶端服務(wù)器功能設(shè)計客戶端主要功能有用戶注冊、用戶登錄、更新在線用戶列表,消息收發(fā)模塊。消息收發(fā)模塊又分為群聊和私聊兩種??蛻舳说墓δ苣K如下圖所示:
42、圖3-1 客戶端功能模塊圖 服務(wù)器的主要功能有處理注冊消息、處理登陸消息、轉(zhuǎn)發(fā)聊天消息、處理退出消息如下圖所示: 圖3-2 服務(wù)器功能模塊圖3.3 客戶端設(shè)計客戶端設(shè)計以用戶使用為出發(fā)點,功能分登錄、注冊、聊天、退出。首先設(shè)計一個連接模塊,即運行客戶端后,連接線程看能否連接到服務(wù)器,要能先連接到服務(wù)器才能在進行登陸注冊等操作,這樣做可以讓用戶知道服務(wù)器是否運行。連接到服務(wù)器后,進行注冊,登陸時系統(tǒng)要能根據(jù)用戶輸入的用戶名和密碼判斷該用戶是否為合法用戶;如果用戶輸入的用戶名或密碼錯誤,系統(tǒng)將給出相應(yīng)的提示,并要求用戶進行重新登錄;如果用戶輸入的用戶名和密碼正確,可進行聊天操作。需要說明的是,在連
43、接到服務(wù)器、登錄、注冊等過程沒有完成是聊天模塊和用戶列表模塊設(shè)計成非激活狀態(tài),登錄成功后在激活這兩個模塊。用戶列表只顯示在線用戶,當(dāng)有用戶登陸成功時用戶列表自動刷新。具體流程圖如下所示:圖3-3 客戶端系統(tǒng)流程圖3.4 服務(wù)器端設(shè)計服務(wù)器分為監(jiān)聽控制、登錄判斷、注冊判斷、聊天信息轉(zhuǎn)發(fā)等模塊。服務(wù)器運行時要能對監(jiān)聽客戶端的連接。服務(wù)器設(shè)計一個鏈表保存已登錄的用戶的用戶名和套接字描述法,方便用戶登錄成功后發(fā)送已登錄的用戶列表。服務(wù)器為每個用戶開辟一個線程負責(zé)與用戶通信。MYsql數(shù)據(jù)庫是一個關(guān)系數(shù)據(jù)庫(relational database)。一個關(guān)系數(shù)據(jù)庫是包含進入預(yù)先定義的種類之內(nèi)的一組表格。
44、每個表格(有時被稱為一個關(guān)系)包含用列表示的一個或更多的數(shù)據(jù)種類。 每行包含一個唯一的數(shù)據(jù)實體,這些數(shù)據(jù)是被列定義的種類,關(guān)系數(shù)據(jù)庫的接口是結(jié)構(gòu)化查詢語言(SQL),同過SQL語句能夠?qū)?shù)據(jù)庫進行創(chuàng)建、刪除、添加、修改、查詢等操作。使用數(shù)據(jù)庫具有能夠存儲大量數(shù)據(jù),且占用空間少;管理操作方便、快捷、高效, 數(shù)據(jù)維護簡單、安全; 檢索統(tǒng)計準(zhǔn)確、迅速、高效;數(shù)據(jù)應(yīng)用共享性好等優(yōu)點。所以本設(shè)計中使用MYsql保存用戶信息,下文是對一些SQL語句介紹:創(chuàng)建表:create 語句create table 表名稱 (列名稱1 數(shù)據(jù)類型, 列名稱2 數(shù)據(jù)類型, 列名稱3數(shù)據(jù)類型, .);舉例:該表包含3列,列
45、名分別是:id、name、addr create table persons (id int, name varchar(255), addr varchar(255);修改表:alter語句在已有的表中添加或刪除列。 alter table 表名 add 列名 數(shù)據(jù)類型; (添加列) 刪除表:drop table語句用于刪除表 drop table 表名稱;插入新行:inser into 語句(全部賦值) 給一行中的所有列賦值。 insert into 表名 values (列值1, 列值2, .); 注意:當(dāng)列值為字符串時要加上號。匹配:where 子句 where 子句用于規(guī)定匹配的條件
46、。修改表中的數(shù)據(jù):update 語句 update 表名 set 列1 = 值1 , 列2 = 值2, . 匹配條件; 刪除表中的數(shù)據(jù):delete 語句 delete from 表名 匹配條件;查詢:select 語句(基礎(chǔ))用于從表中選取數(shù)據(jù),結(jié)果被存儲在一個結(jié)果表中(稱為結(jié)果集)。 1、select * from 表名 匹配條件; 星號(*)是選取所有列的通配符2、select 列名1, 列名2, . from 表名 匹配條件; 以上是一些基本的SQL語句語法格式,設(shè)計中會用到以上的某些語句,在設(shè)計中程序運行時創(chuàng)建數(shù)據(jù)庫,用戶登錄或注冊時,服務(wù)器都會在數(shù)據(jù)庫中匹配用戶。在本設(shè)計中調(diào)用my
47、sql_operation.c中的函數(shù)接口對數(shù)據(jù)庫進行打開,添加等功能。具體流程如下圖:圖3-4 服務(wù)器端系統(tǒng)流程圖3.5 群聊和私聊模塊的設(shè)計聊天時可以向在線用戶中的一個發(fā)送消息也可以向所有在線用戶發(fā)送消息。每個用戶都和服務(wù)器建立了一個獨立的連接。如果用戶A向用戶B發(fā)送消息,工作原理是:用戶A先把消息發(fā)給服務(wù)器,服務(wù)器在把此消息發(fā)給用戶B。如果用戶A向所有在線用戶發(fā)送消息,工作原理是:用戶先把消息發(fā)給服務(wù)器,服務(wù)器把此消息發(fā)給所有在線用戶。如下圖所示圖3-5 群聊私聊處理4 程序描述與詳細描述4.1 服務(wù)器端驗證客戶端的登錄信息4.1.1 功能及實現(xiàn)定義一個結(jié)構(gòu)體Client_Vector保
48、存已登陸的用戶的信息,并針對它實現(xiàn)創(chuàng)建、銷毀、添加節(jié)點、刪除節(jié)點、獲得套接字描述符、獲得用戶名等操作。相關(guān)實現(xiàn)代碼如下:定義節(jié)點類型typedef struct Node char* name; /保存用戶的用戶名 int fd; /保存客戶端套接字描述符 struct Node* next;/指向下一個節(jié)點(Node)Node;定義鏈表類型typedef struct Client_Vector Node head; /頭結(jié)點 int count; /鏈表長度Client_Vector;創(chuàng)建一個鏈表extern Client_Vector *createClientVector();銷毀一個
49、鏈表extern void destroyClientVector(Client_Vector *c);往鏈表里面添加節(jié)點extern void addNodeIntoVector(Client_Vector *c,char* name,int fd);刪除鏈表里fd的節(jié)點extern void removeNodeFromVector(Client_Vector *c,int fd);返回用戶名(name)的套接字描述符,否則返回-1extern int getIndex(Client_Vector *c,char* name);獲得節(jié)點中套接字為fd用戶名extern char* getN
50、ame(Client_Vector* c,int fd);獲得節(jié)點中用戶名為name的套接字extern int getFd(Client_Vector* c,char* name);服務(wù)器端關(guān)鍵代碼如下:if(strcmp(func,#Login) = 0) /如果是登錄模塊則執(zhí)行如下代碼 if(mysqlLogin(&myConnection,user,passwd) = 1) /用戶名與密碼正確執(zhí)行如下 /向所有已登錄的用戶發(fā)送添加該用戶的消息 Node* n=login-head.next; while(n != NULL) memset(buff,0,sizeof(buff); st
51、rcat(buff,#InsertUser:); strcat(buff,user); write(n-fd,buff,strlen(buff); n=n-next; /向鏈表里添加該用戶節(jié)點 addNodeIntoVector(login,user,fd); /給該用戶發(fā)送登錄成功消息 memset(buff,0,sizeof(buff); strcpy(buff,#LoginSuccess); write(fd,buff,strlen(buff); printf(login success!n); return 1; else/用戶名與密碼錯誤執(zhí)行如下 /給該用戶發(fā)送登錄失敗消息 mems
52、et(buff,0,sizeof(buff); strcpy(buff,#LoginFailed); write(fd,buff,strlen(buff); printf(login failed!n); continue; /服務(wù)器端處理用戶消息代碼如下:/數(shù)據(jù)庫的連接void myConnect(MYSQL* myConnection);/用戶登陸的驗證int mysqlLogin(MYSQL* myConnection,char* name,char* passwd);/用戶注冊的驗證int mysqlRegister(MYSQL* myConnection,char* name,cha
53、r* passwd);/斷開連接void myClose(MYSQL* myConnection);/數(shù)據(jù)庫的連接void myConnect(MYSQL* myConnection) mysql_init(myConnection); if(mysql_real_connect(myConnection,localhost,root,wangyu,chat,0,NULL,CLIENT_FOUND_ROWS) printf(my_connect() success!n); qDebug()my_connect() success!; else printf(my_connect() faile
54、d!n); qDebug()my_connect() failed!; /用戶登陸的驗證int mysqlLogin(MYSQL* myConnection,char* name,char* passwd) char q100=select * from user where name=; strcat(q,name); strcat(q, and passwd=); strcat(q,passwd); strcat(q,); int res; res = mysql_query(myConnection,q); if(!res) MYSQL_RES *result=mysql_store_r
55、esult(myConnection); /保存查詢到的數(shù)據(jù)到result if(result) printf(mysqlLogin success!n); qDebug()mysqlLogin success!; mysql_free_result(result);/釋放結(jié)果資源 return 1; else printf(mysqlLogin failed!n); qDebug()mysqlLogin failed!; return -1; else printf(mysqlLogin failed!n); qDebug()mysqlLogin failed!; return -1; /用
56、戶注冊的驗證int mysqlRegister(MYSQL* myConnection,char* name,char* passwd) char q100=insert into user values (; strcat(q,name); strcat(q,); strcat(q,passwd); strcat(q,); int res; res = mysql_query(myConnection,q); if(!res) printf(mysqlRegister success!n); qDebug()mysqlRegister success!; return 1; else pri
57、ntf(mysqlRegister failed!n); qDebug()mysqlRegister failed!; return -1; /斷開連接void myClose(MYSQL* myConnection) mysql_close(myConnection); printf(myClose success!n); qDebug() ); strcat(me,msg);/給自己發(fā)送的消息 strcat(other,#GroupChat:); strcat(other,user); strcat(other, ); strcat(other,msg);/給在線用戶發(fā)送的消息 Node*
58、 n = login-head.next; int count = login-count;while(count-)0) if(n-fd = fd)/給自己發(fā)送消息 write(n-fd,me,strlen(me); else/給其他人發(fā)送消息 write(n-fd,other,strlen(other); n=n-next; else if(strcmp(func,#PrivateChat) = 0)/私聊消息處理strcpy(user,strtok(NULL,:);strcpy(msg,strtok(NULL,:);strcat(me,#PrivateChat:);strcat(me,u
59、ser);strcat(me,:me );strcat(me,msg);/給自己發(fā)送的消息strcat(other,#PrivateChat:);strcat(other,getName(login,fd);strcat(other,:);strcat(other,getName(login,fd);strcat(other, );strcat(other,msg);/給私聊用戶發(fā)送的消息write(fd,me,strlen(me);/給自己發(fā)送消息write(getFd(login,user),other,strlen(other);/給私聊用戶發(fā)送消息4.2.2 技術(shù)概要該模塊涉及I/O文
60、件的操作和多線程,包括線程的創(chuàng)建、線程屬性的設(shè)置和用戶聊天消息的處理。其中在Linux系統(tǒng)中Socket套接字可以用文件的形式進行操作,它提供了一些方便的方式來進行數(shù)據(jù)通信,實現(xiàn)了軟件的基本功能。多線程實現(xiàn)了程序的一對多通信。服務(wù)器通過read函數(shù)來獲取客戶端發(fā)送的數(shù)據(jù),然后對數(shù)據(jù)進行解析,提取聊天模式和聊天內(nèi)容。然后對數(shù)據(jù)按照聊天模式進行不同的處理,最后通過write函數(shù)發(fā)送給客戶端。圖4-1 服務(wù)端接收數(shù)據(jù)的步驟1.接收客戶請求Linux系統(tǒng)提供的接口函數(shù)accept來對接收客戶端的連接請求并存儲客戶的信息。當(dāng)該函數(shù)執(zhí)行完成后,已經(jīng)完成了建立TCP連接的三次握手。2.創(chuàng)建線程創(chuàng)建一個新線程
溫馨提示
- 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 春節(jié)停工停產(chǎn)方案
- 腳手架鋼管購銷合同
- 信息行業(yè)大數(shù)據(jù)與人工智能應(yīng)用方案
- 政府機構(gòu)政務(wù)服務(wù)平臺建設(shè)及優(yōu)化方案設(shè)計
- 法院的離婚協(xié)議書
- 房地產(chǎn)中介服務(wù)合同中介住房合同
- 安裝工程勞動合同
- 連帶責(zé)任保證擔(dān)保合同
- 交通物流業(yè)貨物追蹤系統(tǒng)建設(shè)方案
- 購買公司股份協(xié)議書十
- 學(xué)校辦公室衛(wèi)生制度
- 醫(yī)學(xué)生理學(xué)智慧樹知到答案2024年德州學(xué)院
- GB/T 44412-2024船舶與海上技術(shù)液化天然氣燃料船舶加注規(guī)范
- 小學(xué)三年級數(shù)學(xué)上冊口算題卡(加換算)
- 機械制造HSE協(xié)議書
- 2024-2030年中國靜脈血栓栓塞癥(VTE)防治行業(yè)市場全景監(jiān)測及投資策略研究報告
- 2024年國家保密法知識競賽經(jīng)典題庫及完整答案【必刷】
- 抑郁癥病例分享
- 《子路、曾皙、冉有、公西華侍坐》課件()
- 青島版(五四制)四年級數(shù)學(xué)下冊全冊課件
- 人教鄂教版小學(xué)科學(xué)三年級下冊全冊教案教學(xué)設(shè)計
評論
0/150
提交評論