竇立君++韓坷罕++閆志剛
【 摘 要 】 論文詳細(xì)介紹了如何基于Qt開發(fā)具有注冊、登錄、用戶列表、聊天、封包解析、封包生成、主控模塊、文件傳輸?shù)裙δ艿陌踩磿r(shí)通訊軟件客戶端。
【 關(guān)鍵詞 】 Qt;聊天;客戶端;文件傳輸
Design of Secure Instant Messaging Software Client Based on Qt
Dou Li-jun 1 Han Ke-han 1 Yan Zhi-gang 2
(1. Nanjing Forestry University JiangsuNanjing 210037;2.Dongfang Electronics Co.,Ltd ShandongYantai 264000)
【 Abstract 】 The paper describes in detail how to develop a secure instant messaging client, which is based on Qt, which has the functions of registration, login, user list, chat, packet analysis, packet generation, master control module, file transfer and so on.
【 Keywords 】 qt ; chat ;client ; file transfer
1 引言
即時(shí)通訊軟件的存在很大程度上為人民的生活辦公提供了便利,人們可以通過互聯(lián)網(wǎng)進(jìn)行信息的有效收集和整理,以及與不同地方的人交流,這也是即時(shí)通訊軟件流行起來的原因,因此也使得越來越多人及單位開始從事開發(fā)即時(shí)通訊軟件中來。即時(shí)通訊軟件是客戶端和服務(wù)器端兩個(gè)部分構(gòu)成的,本文通過對客戶端的需求分析、安全性分析、工作流程、代碼設(shè)計(jì)等方面來介紹即時(shí)通訊軟件客戶端的設(shè)計(jì)過程。
2 系統(tǒng)分析
客戶端的需求分析是至關(guān)重要的,完整透徹地對客戶端進(jìn)行需求分析,可以讓我們能夠真正在設(shè)計(jì)時(shí)做到盡全力去滿足用戶們的需求,設(shè)計(jì)的客戶端模塊也會更加全面和完善。
2.1 用戶登錄界面
輸入:用戶名及密碼;處理流程:直接發(fā)往服務(wù)器;輸出:登入成功或失敗。
2.2 用戶注冊界面
輸入:新用戶名及密碼;處理流程:如果兩次密碼輸入不一致則重新輸入,否則直接發(fā)往服務(wù)器;輸出:注冊成功或失敗。
2.3 聊天窗口界面
輸入:用戶輸入的文字信息,或從網(wǎng)絡(luò)接收的文字信息;處理流程:用戶輸入文字信息后,點(diǎn)擊發(fā)送按鈕時(shí),把消息發(fā)往服務(wù)器,如果是從網(wǎng)絡(luò)中接收到文字信息,則顯示到接收區(qū);輸出:發(fā)送文本信息,以及顯示到接收區(qū)。
2.4 用戶列表界面
輸入:服務(wù)器下發(fā)的用戶列表;處理流程:對列表進(jìn)行解析后按一定形式顯示出來;輸出:用戶列表的圖形化顯示。
2.5 個(gè)人資料界面
輸入:用戶錄入數(shù)據(jù)或服務(wù)器下發(fā)的數(shù)據(jù);處理流程:如果是使用者的個(gè)人資料,則編輯后發(fā)送更新指令到服務(wù)器,否則為只讀狀態(tài),顯示服務(wù)器下發(fā)的資料信息;輸出:數(shù)據(jù)更新成功或失敗。
2.6 文件傳輸界面
輸入:對方發(fā)來的請求,或本地文件傳送請求發(fā)出;處理流程:當(dāng)收到對方的請求時(shí),選擇接受,則開始傳輸,否則拒絕連接;由本地發(fā)出時(shí),則發(fā)送數(shù)據(jù)到服務(wù)器;輸出:文件數(shù)據(jù)傳輸。
客戶端是用于實(shí)現(xiàn)與最終用戶的交互過程。因此,客戶端模塊的劃分與客戶端需求分析的相對應(yīng),這里就不再重復(fù)介紹相應(yīng)的功能模塊。
3 安全性分析
即時(shí)通訊軟件的賬號和密碼能夠保存在本地,一些密碼盜竊軟件,如“QQ密碼破解器”、“QQ任我行”、“QQ免密碼登錄器”等通過非法手段從本地系統(tǒng)中盜取賬號和密碼。因此,對本地用戶數(shù)據(jù)的加密保護(hù)體系是十分必要的,并且盡可能地提醒用戶注意保證密碼的安全,定時(shí)修改密碼。同時(shí)對于接收到的鏈接信息,也要謹(jǐn)慎處理,以防對方賬號被盜用而發(fā)來的惡意鏈接。
4 工作流程
從用戶的角度來看,程序打開后,將彈出一個(gè)登錄界面,此時(shí)可以輸入用戶名及密碼來登錄系統(tǒng)。當(dāng)用戶沒有賬戶時(shí),可以從登錄界面中進(jìn)入注冊界面注冊新賬號,注冊成功后,可以重新返回登錄界面,用新賬號登錄到系統(tǒng)。登錄成功后,可以看到一個(gè)用戶列表,當(dāng)想要選擇與某位用戶聊天時(shí),可以通過雙擊打開一個(gè)聊天窗口。當(dāng)有用戶發(fā)送消息來時(shí),軟件也會自動彈出與該用戶的聊天窗口。在聊天窗口中輸入信息,就可以發(fā)送消息給對方,實(shí)現(xiàn)聊天的目的。
從設(shè)計(jì)者角度來看,當(dāng)用戶登錄時(shí),登錄模塊將調(diào)用封包生成模塊編碼用戶名和密碼,然后發(fā)送給服務(wù)器。當(dāng)用戶注冊時(shí),注冊模塊將調(diào)用封包生成模塊編碼新用戶名和密碼,然后發(fā)送給服務(wù)器。需要注意的是,對于登錄和注冊結(jié)果的反饋,并不包括在這兩個(gè)模塊中,因?yàn)槌绦蚴褂昧薗t網(wǎng)絡(luò)類的異步工作機(jī)制,但注冊界面隨時(shí)有可能關(guān)閉,如果在注冊模塊中接收反饋,則有可能會無法收到。如果使用同步模式,則會使GUI界面失去響應(yīng)。
5 關(guān)鍵代碼設(shè)計(jì)
聊天客戶端軟件包括了主窗體、登錄窗體、聊天窗體、注冊窗體等部件。不過,在這里所指的聊天客戶端,僅僅是指代實(shí)現(xiàn)網(wǎng)絡(luò)聊天功能的這個(gè)基本模塊。同樣地,聊天客戶端模塊也使用了QUdpSocket與服務(wù)器間進(jìn)行UDP通信。聊天客戶端模塊本身實(shí)現(xiàn)了完整的聊天功能,但本身并沒有包括任何圖形用戶界面,不過定義了一些相關(guān)的信號和槽,圖形用戶界面部分可以通過與它的信號和槽建立關(guān)聯(lián),來實(shí)現(xiàn)具有圖形用戶界面的客戶端軟件。這樣有效地分離了聊天功能和界面接口,也提高了聊天核心功能與不同用戶界面間的適配度。下面介紹部分關(guān)鍵代碼。
5.1 聊天客戶端的類定義
該類包括了發(fā)送不同指令的函數(shù)和更新信息的信號,具體代碼如下 :
class ChatClient : public QObject
{ Q_OBJECT
public:
explicit ChatClient(QObject *parent = 0);
void login(const QString& id, const QString& password); //登錄
void reigister(const QString& id, const QString& password); //注冊
void setHost(const QHostAddress& host, quint16 port); //設(shè)置服務(wù)器主機(jī)和地址
QHostAddress getRemoteHost() {return m_remoteHost;} //獲取服務(wù)器主機(jī)
qint16 getRemotePort() {return m_remotePort;} //獲取服務(wù)器主機(jī)端口
private:
QUdpSocket* m_udpSocket; //用于與服務(wù)器通訊
QHostAddress m_remoteHost; //服務(wù)器地址
quint16 m_remotePort; //服務(wù)器端口
QDateTime lastAliveTime; //上次接收心跳包時(shí)間
enum {timerTimeout=20, onlineTimeout=30};
signals:
void updateFriendsList(const QStringList&); //更新用戶列表
void updateLoginStatus(bool, const QString&); //更新登錄狀態(tài)
void updateOnlineStatus(bool); //更新在線狀態(tài)
void updateRegisterStatus(bool, const QString&); //更新注冊狀態(tài)
void updateMessage(const QString& from, const QDateTime& sendTime, const QString& content, const QFont& font, const QColor& color); //更新聊天消息
public slots:
void processPendingDatagrams(); //處理消息
void keepAlive(); //發(fā)送心跳包
void logout(); //注銷
void sendMsg(const QString& to, const QString& content, const QFont& font, const QColor& color); //發(fā)送聊天消息
void checkTimeout(); //超時(shí)檢測
};
要使用該類時(shí),需要先建立類對象,然后調(diào)用setHost()設(shè)置聊天服務(wù)器的地址和端口。接下來,在不同的時(shí)候,根據(jù)需要調(diào)用不同的函數(shù)來發(fā)送數(shù)據(jù)即可。同時(shí),因?yàn)镼UdpSocket的通信是異步進(jìn)行的,所以為了能得到服務(wù)器的反饋信息進(jìn)行處理,必須把調(diào)用程序的槽與該對象的信號建立連接,這樣在收到服務(wù)器的消息時(shí),調(diào)用程序的槽便會自動得到調(diào)用,實(shí)際界面數(shù)據(jù)的更新。
5.2 心跳包發(fā)送
心跳包發(fā)磅實(shí)現(xiàn)了發(fā)送心跳包到服務(wù)器端的功能,該功能由定時(shí)器自動定時(shí)執(zhí)行。
void ChatClient::keepAlive()
{ DataBuilder builder;
builder.setHeartBeat(); m_udpSocket->writeDatagram(builder.getData(), m_remoteHost, m_remotePort);
}
5.3 超時(shí)檢測
超時(shí)檢測實(shí)現(xiàn)了在線狀態(tài)的超時(shí)檢測功能,由定時(shí)器自動執(zhí)行。當(dāng)客戶端發(fā)送心跳包到服務(wù)器上時(shí),服務(wù)器也會發(fā)送一個(gè)心跳包作為應(yīng)答,客戶端則記住上次的接收時(shí)間,保存在Last Alive Time中,這樣,當(dāng)在一定的時(shí)間內(nèi)無法與服務(wù)器進(jìn)行通信時(shí),此時(shí)間與當(dāng)前系統(tǒng)時(shí)間的差值必然超出預(yù)期,從而可以判斷為離線狀態(tài)。當(dāng)程序檢測到超時(shí)的時(shí)候,發(fā)出updateOnlineStatus(false)信號。具體代碼如下:
void ChatClient::checkTimeout()
{ if (lastAliveTime.secsTo(QDateTime::currentDateTime()) > onlineTimeout)
{ emit updateOnlineStatus(false); }
}
6 結(jié)束語
使用跨平臺的Qt來實(shí)現(xiàn)的跨平臺的即時(shí)通訊軟件客戶端程序,經(jīng)過在不同平臺上的編譯之后可以運(yùn)行目前常用多個(gè)平臺,并且相互之間可以靈活、方便的相互通信,實(shí)現(xiàn)了即時(shí)通訊軟件客戶端的主要功能。后面,可以在擴(kuò)展功能方便多作補(bǔ)充來提高用戶體驗(yàn),同時(shí)要繼續(xù)在客戶端安全性和網(wǎng)絡(luò)數(shù)據(jù)傳輸安全性方面繼續(xù)探索。
參考文獻(xiàn)
[1] 丁林松,華麗琴.Qt4圖形設(shè)計(jì)與嵌入式開發(fā)[M].北京:人民郵電出版社,2009.
[2] 吳潔.XML應(yīng)用教程[M].北京:清華大學(xué)出版社,2005.
[3] 吳迪.零基礎(chǔ)學(xué)Qt4編程[M].北京:北京航空航天大學(xué)出版社,2010.
[4] 鄭阿奇.Qt 4開發(fā)實(shí)踐[M].北京:電子工業(yè)出版社,2011.
[5] 行天.聊天的危險(xiǎn)看即時(shí)通訊常見安全問題[J].計(jì)算機(jī)與網(wǎng)絡(luò),2007,09:34-35.
[6] 彭元,黃皚昌,莊軍蓮.國內(nèi)即時(shí)通訊軟件的安全脆弱性分析[J]. 廣西科學(xué)院學(xué)報(bào),2005,03:189-192.
基金項(xiàng)目:
1.基于MDA技術(shù)的Web應(yīng)用平臺研究(科技創(chuàng)新)(163070054);
2.軟件服務(wù)外包專業(yè)實(shí)訓(xùn)體系改革(高教研究)(163070644)。
作者簡介:
竇立君(1977-),男,江蘇泰州人,畢業(yè)于南京林業(yè)大學(xué),碩士,工程師;主要研究方向和關(guān)注領(lǐng)域:計(jì)算機(jī)應(yīng)用。
韓坷罕(1991-),女,江蘇蘇州人,南京林業(yè)大學(xué),本科,學(xué)生;主要研究方向和關(guān)注領(lǐng)域:計(jì)算機(jī)網(wǎng)絡(luò)工程。
閆志剛(1972-),男,陜西西安人,畢業(yè)于西安工程大學(xué),學(xué)士,工程師;主要研究方向和關(guān)注領(lǐng)域:電力自動化。