摘要:主要介紹在Linux系統(tǒng)下實現(xiàn)一個局域網(wǎng)的聊天軟件。系統(tǒng)采用C語音編寫,QT界面開發(fā)工具開發(fā),適用于不同架構(gòu)的CPU;在對比分析了TCP協(xié)議和UDP協(xié)議后,選擇TCP方式進行連接,實現(xiàn)信息的傳輸。
關(guān)鍵詞:QT;傳輸控制協(xié)議;用戶數(shù)據(jù)報協(xié)議
中圖分類號:TP311.1 文獻標識碼:A 文章編號:1007-9599 (2012) 22-0000-02
Linux操作系統(tǒng)具有良好的可移植性,豐富的網(wǎng)絡(luò)功能,多用戶多任務(wù)等優(yōu)點,運用領(lǐng)域非常廣泛,主要有通信、信息、工業(yè)控制等。在這個信息化的時代,人與人的溝通越來越注重時效性,本文所設(shè)計的聊天系統(tǒng)能使在同一局域網(wǎng)下的各用戶端實現(xiàn)實時通信,由于越來越多的企業(yè)在其內(nèi)部使用局域網(wǎng)來進行工作,使得系統(tǒng)具有一定的工業(yè)價值和現(xiàn)實意義。本文在QT/Embedded的基礎(chǔ)上,開發(fā)了面向應(yīng)用層的局域網(wǎng)聊天系統(tǒng),可實現(xiàn)登陸,點對多廣播式群聊,點對點聊天等功能。
1 QT技術(shù)
QT是Trolltech公司的一個標志性產(chǎn)品。QT是一個支持多操作系統(tǒng)平臺的應(yīng)用程序開發(fā)框架,它的開發(fā)語言是C++。[1]
本文是利用QT的信號與槽機制設(shè)計與實現(xiàn)的。信號/槽機制是一種全新且可選的應(yīng)用于對象間的通信機制,不同于以往的回調(diào)函數(shù)對消息處理函數(shù)有很強的依賴性并且不是類型安全的。信號/槽機制是QT的核心機制,可以使用任意數(shù)量、任何類型的參數(shù)應(yīng)用于對象之間的通信。信號(signal)在特定事件發(fā)生時就會發(fā)出,槽(slot)是普通的成員函數(shù),用connect()函數(shù)把插槽和信號連接起來。[2]每個信號和槽都對應(yīng)一個簽名當發(fā)出一個信號,發(fā)射信號的對象不需要知道具體哪個槽接收信號,系統(tǒng)將會立即找到與該信號簽名相匹配的槽簽名,并將信號和槽相連接。
2 通信協(xié)議
TCP/IP協(xié)議將經(jīng)典的OSI7協(xié)議模型簡化為4層:應(yīng)用層、傳輸層、網(wǎng)絡(luò)層和網(wǎng)絡(luò)接口層。[3]本系統(tǒng)主要實現(xiàn)的是數(shù)據(jù)的傳輸,所以主要運用傳輸層的TCP協(xié)議和UDP協(xié)議。
2.1 TCP協(xié)議
TCP協(xié)議即傳輸控制協(xié)議,是面向連接的傳輸層通信協(xié)議,提供端到端,全雙工通信。TCP在發(fā)送數(shù)據(jù)前通過三次握手初始化,建立虛連接。TCP協(xié)議在傳輸數(shù)據(jù)時在每一個被傳送的數(shù)據(jù)上都加上序號以保證接收端按順序接收,另外接收端每收到一個數(shù)據(jù),就像發(fā)送端返回一個與序號對應(yīng)的確認號,這就保證了通信的可靠性。
2.2 UDP協(xié)議
UDP協(xié)議即用戶數(shù)據(jù)報協(xié)議,是傳輸層另一個重要的傳輸協(xié)議,主要作用就是將網(wǎng)絡(luò)數(shù)據(jù)流量壓縮成數(shù)據(jù)報的形式。UDP協(xié)議是一個無連接的協(xié)議,發(fā)送端一次發(fā)送一個應(yīng)用層交來的報文,不管報文的長度;接收端除去報文首部后一次性將IP層交來的報文交付給應(yīng)用層。在數(shù)據(jù)傳輸?shù)倪^程中,如果出現(xiàn)數(shù)據(jù)包丟失,UDP協(xié)議不會做出任何檢測或提示。
由于不同協(xié)議的地址格式不同、端口分配互相獨立、工作方式不同,所以網(wǎng)絡(luò)進程通信時,必須在眾多的協(xié)議中作出選擇。[4]對比以上TCP協(xié)議與UDP協(xié)議的特點,TCP協(xié)議具有高可靠性等特點,本文選擇了TCP協(xié)議傳輸聊天信息。
2.3 socket
在進行數(shù)據(jù)傳輸時,會出現(xiàn)同時為多個應(yīng)用程序進程提供并發(fā)服務(wù)的情況。Socket就是系統(tǒng)提供的用于區(qū)別不同應(yīng)用程序進程和連接的通信機制。在Linux系統(tǒng)中的網(wǎng)絡(luò)編程就是通過socket接口來進行的,通過它能實現(xiàn)進程之間的數(shù)據(jù)通信。
3 系統(tǒng)設(shè)計與實現(xiàn)
3.1 連接模塊
不同客戶端上的用戶想要進行通信,必須先通過IP和端口號連接已經(jīng)啟動的服務(wù)器。本文采用客戶機/服務(wù)器模式,再分別屬于不同部門的不同平臺的計算機上分別開發(fā)負責偵聽的socket服務(wù)器和負責連接的socket客戶端。[5]在客戶端創(chuàng)建一個socket套接字用來和服務(wù)器進行通信,本文選用QT中QAbstractSocket類的connectToHost函數(shù)來實現(xiàn)此功能。
3.2 用戶注冊模塊
用戶在注冊賬號時通常有兩種可能:注冊成功或者賬號已存在,注冊失敗。在客戶端,填入所需注冊的賬號和密碼,點擊“注冊”鍵后,產(chǎn)生一個信號與槽機制,在槽函數(shù)中通過clicked()信號將賬號和密碼發(fā)送給服務(wù)器。在服務(wù)器端,將客戶端發(fā)送來的數(shù)據(jù)進行語法分析,打開用戶管理文件usr_manage.dbo,在該文件中查找賬號是否被注冊過并返回相應(yīng)函數(shù)給客戶端。
3.3 用戶登錄模塊
用戶登錄服務(wù)器時也會有兩種可能:登陸成功或者因輸入賬號已登錄,密碼錯誤,賬號不存在使得登錄失敗。在客戶端,點擊“登錄”按鍵后,已輸入的賬號和密碼會通過denglu()函數(shù)發(fā)送給服務(wù)器。在服務(wù)器端,接收到客戶端發(fā)來的數(shù)據(jù)后進入登錄函數(shù)uselogin()函數(shù),打開用戶管理文件usr_manage.dbo,在該文件中判斷賬號和密碼是否正確。
3.4 聊天模塊
在聊天模塊中分群聊和私聊兩種模式。
群聊需選擇“群聊”按鍵進入槽處理函數(shù)qunliao(),客戶端就將用戶在聊天框輸入的內(nèi)容發(fā)送給服務(wù)器。服務(wù)器接收到的數(shù)據(jù)后判斷是群聊還是私聊,再將數(shù)據(jù)轉(zhuǎn)發(fā)給所有在線用戶。
用戶在點擊“私聊”按鍵前先選擇私聊對象,進入槽處理函數(shù)opensiliao()設(shè)置參數(shù),然后進入點擊聊天對象函數(shù),將已點擊了對象的用戶名記錄下來,最后將這些數(shù)據(jù)發(fā)給服務(wù)器端。服務(wù)器端接到客戶端的數(shù)據(jù)后,進入語法分析程序判斷是客戶端要進行群聊還是私聊,從而進入私聊處理程序,將私聊對象的名字提出來,把聊天的內(nèi)容發(fā)給了他。
4 總結(jié)
本文通過分析網(wǎng)絡(luò)聊天系統(tǒng),講述了QT、TCP/IP、UDP、Socket網(wǎng)絡(luò)套接字等技術(shù)的工作原理與應(yīng)用,闡述了局域網(wǎng)聊天系統(tǒng)的開發(fā)流程和模塊設(shè)計。本系統(tǒng)界面美觀友好,易操作,實現(xiàn)了與用戶的良好交互性,不僅可以實現(xiàn)本地局域網(wǎng)聊天還可以運用到互聯(lián)網(wǎng)上。
參考文獻:
[1]謝川.嵌入式Liunx開發(fā)基礎(chǔ)[M].北京:中國鐵道出版社,2011.
[2]陳周國,王勝銀,付國晴,鄧赟.基于Linux QT技術(shù)的遠程監(jiān)控GUI設(shè)計[J].通信技術(shù),2009,42(12):234-236.
[3]趙祖龍.基于Qt/Embedded的嵌入式跨平臺聊天系統(tǒng)設(shè)計[J].信息技術(shù),2010(12):144-147.
[4]何進,謝松巍.基于Socket的TCP/IP網(wǎng)絡(luò)通訊模式研究[J].計算機應(yīng)用研究,2001,18(8).
[5]李揚,耿昌宇,張麗芬.基于socket通訊模式下的跨平臺數(shù)據(jù)平臺[J].北京理工大學(xué)學(xué)報,2002,22(1):81-84.