?

基于Qt的安全即時通訊軟件服務器端設計

2017-02-13 16:04竇立君韓坷罕閆志剛
網絡空間安全 2016年11期
關鍵詞:服務器端

竇立君 韓坷罕 閆志剛

【 摘 要 】 論文詳細介紹了如何基于Qt開發具有用戶注冊、用戶資料維護、用戶列表下發、登錄校驗、消息轉發、文件傳輸等功能的安全即時通訊軟件服務器端。

【 關鍵詞 】 qt;消息轉發;服務器端;文件傳輸

Design of Network Chat Software Server 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 server, which is based on Qt, which is user registration, user data maintenance, user list, login verification, message forwarding, file transfer and so on.

【 Keywords 】 qt; message forwarding; server; file transfer

1 引言

隨著聊天軟件應用在人們生活中各方面,人們也變得越來越重要重視聊天軟件的存在,因為聊天軟件在很大程度上為人民的生活辦公提供了便利,人們可以通過互聯網進行信息的有效收集和整理,以及與不同地方的人交流。

目前的聊天軟件基本都是由服務器端和客戶端兩部分組成,客戶端有Web版的和本地版的,無論哪種版本,它們都需要通過與服務器端的通信來實現最終功能。

本文通過對服務器端的功能分析、安全性、工作流程、關鍵代碼設計等方面,來闡述安全聊天軟件服務器端的設計過程。

2 系統分析

服務器聊天系統很重要的組成部分,所以對于服務器的功能需求分析是非常重要的,正確完整的分析,是成功構建一個聊天系統服務器的第一步。

能夠成功地分析好服務器的需求,對于后面設計服務器的模塊工作是不可或缺的,所以在這里,首先進行的就是關于這個即時聊天系統服務器的需求分析。

2.1 登錄校驗

輸入:來自客戶端的用戶名和密碼;

處理流程:與數據庫中的用戶名和密碼匹配,并反饋結果給客戶端;

輸出:匹配成功或失敗。

2.2 用戶注冊

輸入:來自客戶端的用戶名和密碼;

處理流程:在數據庫中寫入新用戶名和密碼,并反饋結果給客戶端;

輸出:新建成功或失敗。

2.3 消息轉發

輸入:客戶端所發送的聊天信息;

處理流程:根據所要發送到的用戶名進行轉發,用戶不在線時另作處理;

輸出:轉發信息給發往方。

2.4 文件傳輸

輸入:客戶端所發送的文件數據;

處理流程:直接轉發到發往方;

輸出:轉發數據給發往方。

2.5 用戶資料維護

輸入:客戶端所發送的更新請求;

處理流程:按請求更新數據庫中對應的數據;

輸出:更新成功或失敗。

2.6 用戶列表下發

輸入:用戶登錄成功;

處理流程:當某用戶登錄成功后,下發在線用戶列表給該用戶;

輸出:在線用戶列表。

根據服務器端的需求分析,進行功能模塊的劃分:封包解析模塊、封包生成模塊、封包分發模塊、數據存儲模塊、用戶注冊模塊、用戶登錄模塊、文本信息轉發模塊、離線文本信息轉發模塊、文件傳輸模塊、用戶列表下發模塊、用戶資料模塊、超時檢測模塊,這些模塊既有獨立完成相關功能,也有相互協調,合作完成最終任務。

3 安全性分析

現在大家使用的安全即時通訊軟件基本都是使用數據報協議UDP。UDP和傳輸控制協議TCP都是傳輸層協議,但UDP是一種面向無連接的傳輸協議,這種協議在進行雙方數據傳輸時,發送方只要知道接收方的地址和端口號就可以向接收方發送數據。這種協議帶來高速便捷的數據傳輸,但不提供數據傳送的安全保障機制,因此數據包傳輸不可靠,丟包率高。具體實現時要設計一種機制來對用戶傳遞的數據提供一種丟失檢測。

對于文件傳輸,如果是在同一局域網內,或者雙方都具有公網IP,只要直接建立TCP連接就可以傳文件。但是,在互聯網上,實際的情況比這更要復雜,客戶端有可能處于同一NAT或不同的NAT之內,客戶端之間要直接通信比較困難。在此處的文件傳輸案例中,就可以使用“TCP”打洞技術,或者通過服務器中轉,來穿透NAT進行數據收發。

4 工作流程

有了完整的模塊劃分,現在需要的就是構建服務器的工作流程,讓服務器運轉起來。本聊天服務器的核心工作流程,簡單地說,就是不斷把消息包分類攤派到各個不同處理模塊上的過程。

服務器在指定的端口上偵聽數據包,當接收到數據包后,首先調用封包解析模塊對數據包進行解析,獲取命令類型后,再根據命令類型的不同來調用不同的模塊。不同的模塊處理完成后,再調用封包生成模塊來打包結果,把處理結果發送給客戶端。

當接收到的是登錄命令時,將調用登錄管理模塊來判斷是否可以登入系統,不管是否能登入,都把結果打包返回給客戶端。如果能成功登入,則繼續調用用戶列表下發模塊,把在線用戶列表打包發送給客戶端。

當接收到的是注冊命令時,將調用用戶注冊模塊來往系統中添加新用戶,注冊模塊會調用數據存儲模塊進行處理,然后把結果打包返回給客戶端。

當接收到的是資料更新命令時,將調用資料管理模塊,資料管理模塊又會調用數據存儲模塊進行處理,處理完成后,把結果反饋給客戶端。

當接收到的是文本消息時,將調用文本消息轉發模塊進行處理,該模塊從解析得到的結果中,獲取所要發送往的客戶端,然后進行轉發。如果檢測到所要發往的客戶端不在線,則轉入離線消息模塊處理。

用戶登錄后,客戶端會定時發送心跳包到服務器,服務器自動維護此在線狀態列表,并定時執行超時檢測模塊,把超時的用戶從在線列表中刪除。

5 關鍵代碼設計

聊天服務器的工作流程比較簡單,即:收到消息→處理消息→轉發處理后的消息。聊天服務器啟動時在特定的端口監聽,當有數據到達時,自動判斷消息類型,進行不同的處理,然后根據處理結果,把它發送給客戶端。實現中,消息的接收和發送,以及判斷消息類型,都比較簡單,工作量較大的則是處理消息的部分。因為有很多不同的命令,對應的,也有不同的處理過程,所以設計中,把這些處理過程分離成單獨的處理邏輯,在類中表現為不同的函數。本模塊的設計并不包含圖形用戶界面相關的部分,當最終的服務器軟件需要搭配圖形界面時,只需要在聊天服務器模塊中定義相關的信號,并在合適的時候發出信號。圖形界面程序就可以通過聊天服務器模塊的信號和它的槽進行連接,來實現顯示更新等功能。

5.1 聊天服務器端的類定義

為了利用Qt的信號和槽功能,聊天服務器類直接從QObject繼承,具體代碼如下 :

class ChatServer : public QObject

{ Q_OBJECT

public:

explicit ChatServer(QObject *parent = 0);

void start(quint16 port=4500); //啟動服務

private:

void registerUser(const QString& id, const QString& password, const QHostAddress& addr, quint16 port);//注冊用戶

bool login(const QString& id, const QString& password, const QHostAddress& addr, quint16 port);//用戶登錄

void relayMessage(const QString& to, const QString& message, const QFont& font, const QColor& color, const QHostAddress& addr, quint16 port);//轉發聊天消息

void sendFriendsList(const QHostAddress& addr, quint16 port); //發送用戶列表

void feedback(const QHostAddress& addr, quint16 port); //反饋

void logout(const QHostAddress& addr, quint16 port); //注銷

void keepAlive(const QHostAddress& addr, quint16 port); //激活

QUdpSocket *m_udpSender; //發送數據的UDP對象

QUdpSocket *m_udpReceiver; //監聽數據的UDP對象

QHash m_nameHash; //名字表

QHash m_hostHash; //主機表

QHash m_aliveTimeHash; //激活狀態表

Storage m_storage; //數據存儲對象

enum {onlineTimeout = 30}; //在線超時時間

private slots:

void processPendingDatagrams(); //網絡數據處理

void checkTimeout(); //檢查超時狀態

};

在ChatServer類的實現中,需要注意名稱表、主機表以及激活狀態表的維護,它們是維持服務器工作狀態的核心。為了實現快速查詢,這幾張表都采用Qt中的哈希表QHash進行存儲。如:名稱表是用戶名到(主機,端口號)的映射,即通過用戶名可以查詢到對應的主機地址和端口號,在轉發消息時就要使用到名稱表。

5.2 超時檢測

超時檢測功能由定時器自動執行,以實現隔固定時間更新一次在線狀態的功能。當到達時間點時,程序開始遍歷激活狀態表中的所有用戶,檢查其最后一次的心跳包時間與當前系統時間的差值是否超過指定的預期,如果沒有,則表示用戶仍然正常在線,如果超時,則作自動注銷處理。具體代碼如下:

void ChatServer::checkTimeout()

{ QList keys = m_aliveTimeHash.keys(); //查詢所有用戶名

QDateTime now = QDateTime::currentDateTime(); //獲取當前系統時間

for (int i = 0; i < keys.length(); ++i) //遍歷所有用戶

{ if (m_aliveTimeHash.value(keys.at(i)).secsTo(now) > onlineTimeout) //檢查用戶是否超時

{ qDebug() << trUtf8("%1 timeout").arg(keys.at(i));

QStringList list = keys.at(i).split(" ");

QHostAddress addr;

addr.setAddress(list.at(0).toInt());

quint16 port = list.at(1).toInt();

logout(addr, port); //用戶超時的時候作注銷處理

}}}

6 結束語

關鍵代碼介紹之后,其它功能的代碼的接口規范及實現也就相對容易了,這里就不再作介紹。服務器端軟件設計完成之后,配合客戶端軟件完成了消息的傳遞及轉發,客戶端文件的傳輸及服務器端日志的記錄等功能。后期,還需要繼續在數據的傳輸安全性和可靠性方面做好優化,做好客戶端其它的擴展功能的支持,提高客戶端用戶對服務器端響應和支持的體驗。

參考文獻

[1] 丁林松,華麗琴.Qt4圖形設計與嵌入式開發[M].北京:人民郵電出版社.2009.

[2] (英)薩默菲爾德.Qt高級編程[M].北京:電子工業出版社.2011.

[3] 吳迪.零基礎學Qt4編程[M].北京:北京航空航天大學出版社.2010.

[4] 代勇.Visual C++網絡通信編程技術詳解[M].北京:機械工業出版社.2011.

[5] 行天. 聊天的危險看即時通訊常見安全問題[J]. 計算機與網絡,2007,09:34-35.

[6] 李延松,余隋懷,吳博. 基于Socket的安全即時通訊軟件的設計[J]. 科學技術與工程,2007,12:2974-2977.

基金項目:

基于MDA技術的Web應用平臺研究(科技創新)(163070054); 軟件服務外包專業實訓體系改革(高教研究)(163070644)。

作者簡介:

竇立君(1977-),男,江蘇泰州人,碩士;主要研究方向和關注領域:計算機應用。

猜你喜歡
服務器端
計算機局域網整體監控系統構建研究
智能冰箱關鍵技術研究
考試系統服務器端的設計與實現
一種太陽能戶外自動花架電氣系統簡介
小型無人機視頻實時傳輸的設計與開發
Web應用中的實時消息交互技術
基于Qt的網絡聊天軟件服務器端設計
一種基于Java的IM即時通訊軟件的設計與實現
基于C/S架構的嵌入式監控組態外設擴展機制研究與應用
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合