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