基于Qt的安全即时通讯软件客户端设计

2017-03-10 21:42窦立君韩坷罕闫志刚
网络空间安全 2017年1期
关键词:客户端聊天

窦立君++韩坷罕++闫志刚

【 摘 要 】 论文详细介绍了如何基于Qt开发具有注册、登录、用户列表、聊天、封包解析、封包生成、主控模块、文件传输等功能的安全即时通讯软件客户端。

【 关键词 】 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 引言

即时通讯软件的存在很大程度上为人民的生活办公提供了便利,人们可以通过互联网进行信息的有效收集和整理,以及与不同地方的人交流,这也是即时通讯软件流行起来的原因,因此也使得越来越多人及单位开始从事开发即时通讯软件中来。即时通讯软件是客户端和服务器端两个部分构成的,本文通过对客户端的需求分析、安全性分析、工作流程、代码设计等方面来介绍即时通讯软件客户端的设计过程。

2 系统分析

客户端的需求分析是至关重要的,完整透彻地对客户端进行需求分析,可以让我们能够真正在设计时做到尽全力去满足用户们的需求,设计的客户端模块也会更加全面和完善。

2.1 用户登录界面

输入:用户名及密码;处理流程:直接发往服务器;输出:登入成功或失败。

2.2 用户注册界面

输入:新用户名及密码;处理流程:如果两次密码输入不一致则重新输入,否则直接发往服务器;输出:注册成功或失败。

2.3 聊天窗口界面

输入:用户输入的文字信息,或从网络接收的文字信息;处理流程:用户输入文字信息后,点击发送按钮时,把消息发往服务器,如果是从网络中接收到文字信息,则显示到接收区;输出:发送文本信息,以及显示到接收区。

2.4 用户列表界面

输入:服务器下发的用户列表;处理流程:对列表进行解析后按一定形式显示出来;输出:用户列表的图形化显示。

2.5 个人资料界面

输入:用户录入数据或服务器下发的数据;处理流程:如果是使用者的个人资料,则编辑后发送更新指令到服务器,否则为只读状态,显示服务器下发的资料信息;输出:数据更新成功或失败。

2.6 文件传输界面

输入:对方发来的请求,或本地文件传送请求发出;处理流程:当收到对方的请求时,选择接受,则开始传输,否则拒绝连接;由本地发出时,则发送数据到服务器;输出:文件数据传输。

客户端是用于实现与最终用户的交互过程。因此,客户端模块的划分与客户端需求分析的相对应,这里就不再重复介绍相应的功能模块。

3 安全性分析

即时通讯软件的账号和密码能够保存在本地,一些密码盗窃软件,如“QQ密码破解器”、“QQ任我行”、“QQ免密码登录器”等通过非法手段从本地系统中盗取账号和密码。因此,对本地用户数据的加密保护体系是十分必要的,并且尽可能地提醒用户注意保证密码的安全,定时修改密码。同时对于接收到的链接信息,也要谨慎处理,以防对方账号被盗用而发来的恶意链接。

4 工作流程

从用户的角度来看,程序打开后,将弹出一个登录界面,此时可以输入用户名及密码来登录系统。当用户没有账户时,可以从登录界面中进入注册界面注册新账号,注册成功后,可以重新返回登录界面,用新账号登录到系统。登录成功后,可以看到一个用户列表,当想要选择与某位用户聊天时,可以通过双击打开一个聊天窗口。当有用户发送消息来时,软件也会自动弹出与该用户的聊天窗口。在聊天窗口中输入信息,就可以发送消息给对方,实现聊天的目的。

从设计者角度来看,当用户登录时,登录模块将调用封包生成模块编码用户名和密码,然后发送给服务器。当用户注册时,注册模块将调用封包生成模块编码新用户名和密码,然后发送给服务器。需要注意的是,对于登录和注册结果的反馈,并不包括在这两个模块中,因为程序使用了Qt网络类的异步工作机制,但注册界面随时有可能关闭,如果在注册模块中接收反馈,则有可能会无法收到。如果使用同步模式,則会使GUI界面失去响应。

5 关键代码设计

聊天客户端软件包括了主窗体、登录窗体、聊天窗体、注册窗体等部件。不过,在这里所指的聊天客户端,仅仅是指代实现网络聊天功能的这个基本模块。同样地,聊天客户端模块也使用了QUdpSocket与服务器间进行UDP通信。聊天客户端模块本身实现了完整的聊天功能,但本身并没有包括任何图形用户界面,不过定义了一些相关的信号和槽,图形用户界面部分可以通过与它的信号和槽建立关联,来实现具有图形用户界面的客户端软件。这样有效地分离了聊天功能和界面接口,也提高了聊天核心功能与不同用户界面间的适配度。下面介绍部分关键代码。

5.1 聊天客户端的类定义

该类包括了发送不同指令的函数和更新信息的信号,具体代码如下 :

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&); //更新登录状态

void updateOnlineStatus(bool); //更新在线状态

void updateRegisterStatus(bool, const QString&); //更新注册状态

void updateMessage(const QString& from, const QDateTime& sendTime, const QString& content, const QFont& font, const QColor& color); //更新聊天消息

public slots:

void processPendingDatagrams(); //处理消息

void keepAlive(); //发送心跳包

void logout(); //注销

void sendMsg(const QString& to, const QString& content, const QFont& font, const QColor& color); //发送聊天消息

void checkTimeout(); //超时检测

};

要使用该类时,需要先建立类对象,然后调用setHost()设置聊天服务器的地址和端口。接下来,在不同的时候,根据需要调用不同的函数来发送数据即可。同时,因为QUdpSocket的通信是异步进行的,所以为了能得到服务器的反馈信息进行处理,必须把调用程序的槽与该对象的信号建立连接,这样在收到服务器的消息时,调用程序的槽便会自动得到调用,实际界面数据的更新。

5.2 心跳包发送

心跳包发磅实现了发送心跳包到服务器端的功能,该功能由定时器自动定时执行。

void ChatClient::keepAlive()

{ DataBuilder builder;

builder.setHeartBeat(); m_udpSocket->writeDatagram(builder.getData(), m_remoteHost, m_remotePort);

}

5.3 超时检测

超时检测实现了在线状态的超时检测功能,由定时器自动执行。当客户端发送心跳包到服务器上时,服务器也会发送一个心跳包作为应答,客户端则记住上次的接收时间,保存在Last Alive Time中,这样,当在一定的时间内无法与服务器进行通信时,此时间与当前系统时间的差值必然超出预期,从而可以判断为离线状态。当程序检测到超时的时候,发出updateOnlineStatus(false)信号。具体代码如下:

void ChatClient::checkTimeout()

{ if (lastAliveTime.secsTo(QDateTime::currentDateTime()) > onlineTimeout)

{ emit updateOnlineStatus(false); }

}

6 结束语

使用跨平台的Qt来实现的跨平台的即时通讯软件客户端程序,经过在不同平台上的编译之后可以运行目前常用多个平台,并且相互之间可以灵活、方便的相互通信,实现了即时通讯软件客户端的主要功能。后面,可以在扩展功能方便多作补充来提高用户体验,同时要继续在客户端安全性和网络数据传输安全性方面继续探索。

参考文献

[1] 丁林松,华丽琴.Qt4图形设计与嵌入式开发[M].北京:人民邮电出版社,2009.

[2] 吴洁.XML应用教程[M].北京:清华大学出版社,2005.

[3] 吴迪.零基础学Qt4编程[M].北京:北京航空航天大学出版社,2010.

[4] 郑阿奇.Qt 4开发实践[M].北京:电子工业出版社,2011.

[5] 行天.聊天的危险看即时通讯常见安全问题[J].计算机与网络,2007,09:34-35.

[6] 彭元,黃皑昌,庄军莲.国内即时通讯软件的安全脆弱性分析[J]. 广西科学院学报,2005,03:189-192.

基金项目:

1.基于MDA技术的Web应用平台研究(科技创新)(163070054);

2.软件服务外包专业实训体系改革(高教研究)(163070644)。

作者简介:

窦立君(1977-),男,江苏泰州人,毕业于南京林业大学,硕士,工程师;主要研究方向和关注领域:计算机应用。

韩坷罕(1991-),女,江苏苏州人,南京林业大学,本科,学生;主要研究方向和关注领域:计算机网络工程。

闫志刚(1972-),男,陕西西安人,毕业于西安工程大学,学士,工程师;主要研究方向和关注领域:电力自动化。

猜你喜欢
客户端聊天
“聊天”等十五则
谈5G时代线上新闻客户端的打造
尬聊
虚拟专用网络访问保护机制研究
我就是不想跟你聊天了
中国国际广播电台“ China ”系列 多语种移动客户端上线
新闻客户端差异化发展策略
敞开门聊天
浅析IEEE 802.1x及其客户端软件
聊天不倒王