基于QT(C++)实现(界面)即时通讯软件

计算机网络 课程实验报告

实验题目: 即时通讯

概念简介:

即时通讯(Instant Messaging)是目前上最为流行的通讯方式,各种各样的即时通讯软件也层出不穷;服务提供商也提供了越来越丰富的通讯服务功能。 不容置疑,Internet 已经成为真正的信息高速公路。从实际工程应用角度出发,以计算机网络原理为指导,结合当前网络中的一些常用技术,编程实现基于的网络聊天工具是切实可行的。

实时通信(InstantMessaging,简称 IM)是一个实时系统,允许两人或多人使用实时的传递、、语音与视频交流。

TCP 协议

TCP(传输控制协议)协议是 TCP/IP 协议族中的面向连接的、可靠的传输层协议。TCP 与 UDP 不同,它允许发送和接收字节流形式的数据。为了使服务器和客户端以不同的速度发送和接收数据,TCP 提供了发送和接收两个缓冲区。TCP 提供全双工服务,数据同时能双向流动。通信的每一方都有发送和接收两个缓冲区,可以双向发送数据。TCP 在报文中加上一个递增的确认序列号来告诉发送端,接收端期望收到的下一个报文,如果在规定时间内,没有收到关于这个包的确认响应,则重新发送此包,这保证了 TCP 是一种可靠的传输层协议。

实验目的:

设计并实现 windows 平台上的即时通讯软件。实现即时聊天功能和文件传输功能。

项目简介:

项目使用 c/s 架构,由服务器(server)和客户端(client)组成。

服务端进行数据库操作存储用户信息、聊天记录和传输文件副本等数据。同时进行客服注册、登入请求的处理与进行聊天信息和文件的转发工作。

客户端提供了用户交互界面,提供有注册、登入、查看在线用户、即时聊天、查看历史记录、传输文件等功能。

项目使用 c++ 编写,主要使用了 QT c++ 库,即时通讯和文件传输使用 TCP 协议,编程主要使用 QT 提供的 QTcpServer 和 QTcpSocker 类。数据存储使用了轻量级数据库 SQLite。

用户交互界面采用类似 QQ 的多窗体设计,包括注册界面、登入界面、用户列表界面、聊天界面、文件选择界面、聊天记录界面等,符合用户即时通讯软件使用习惯,提供了较好的体验。

项目流程:

项目实现:

1 服务端(server)实现

1.1 工具类 Util

提供了 string 转 qint64 的方法、利用事件循环实现的主线程不阻塞的延迟方法、遍历文件夹文件夹下寻找是否存在同名文件并返回重名个数的方法,有 map 类型的成员变量 g_qmUserMessageMap,关键字是 QTcpSocket 对象的指针,值为用户名字符串,用于维护在线用户列表,对多个连接进行管理。

1.2 数据库操作类 MySQL

提供了服务器初始化所需的表单建立函数,提供了注册的插入函数和登入的查找函数,提供了插入聊天记录函数和返回聊天记录函数等。有 QSqlQuery 类型的指针变量 query用于数据库操作。为即时通讯提供数据支持。

1.3 重写 TcpServer 类 MyTcpServer

重写 MyTcpServer 类继承 QTcpServer 类,主要重写 incomingConnection()方法,扩展通过记录 Socket 句柄扩展对连接的控制,实现通过用户到 Socket 的映射关系,实现连接套接字管理。提供了 UI 和连接处理线程之间的通讯方法。

1.4 线程类 MyTcpSocketThread

MyTcpSocketThread 类继承自 QT 线程类 QThread,在子线程中进行 socket 处理,提供了连接建立和数据传输等信号和槽函数,同时包括函数 writeDescriptor 对 socket 句柄进行控制。其中包含 QTcpSocket 类型的成员变量 tcpSocket。

1.5 窗口类 MainWindow

为程序交互类,对服务器进行控制。主要使用线程类中发出的信号来更新 ui。包含 receiveChatFromServer、receiveFileFromServer、receivedisconChatFromServer、receiveFileProcessFromServer 等槽函数。有两个 MyTcpServer 类成员变量,chatServer 用来处理聊天请求,fileServer 用来处理文件传输请求。

2 客户端(client)实现

2.2 虚基类 ISOCKETSink

作为多窗口程序中子窗口的父类,方便进行连接信息的回调和显示,减少了程序的耦合性。

2.2 Socket 处理工具类 SocketUtil

SocketUtil 包括了 connect、SocketUtil、writeData 等函数,对 Socket 的连接、初始化、数据传输等功能进行封装。WriteIni、ReadIni 函数主要实现对服务器 ip 和端口号的记录,方便多窗口程序的实现和切换。

2.3 登入窗体 Login

作为主要的交互窗体,用户输入服务器进程 IP 和端口号,账户和密码,如拼配则登入成功,获得反馈,进入在线用户列表界面。窗体类 Login 继承自 ISOCKETSink,提供了处理用户操作信号的槽函数 on_pb_login_clicked、on_pb_register_clicked 等槽函数。同时有 QTcpSocket 类型的和 SocketUtil 类型的成员变量用于进行与服务端的 Tcp 通讯。

2.4 注册窗体 Register

主要为新用户提供注册功能,用户输入用户名,重复输入两次相同的密码,在于服务器进程成功建立连接的前提下,便可以实现注册账户。窗体类 Register 继承自 ISOCKETSink,与 Login 类相似,主要通过对用户操作信号进行响应获取用户输入的信息。同时有 QTcpSocket 类型的和 SocketUtil 类型的成员变量用于进行与服务端的 Tcp 通讯。

2.5 在线用户列表窗体类 OnlineUserlist

主要实现在线用户的显示,用户可以看到当前在线全部用户的用户名,用户选择想要进行聊天的用户便可以打开与该用户的聊天窗口,实现类似 QQ 的功能。窗体类 OnlineUserlist 继承自 ISOCKETSink,与 Login 类相似,主要通过对用户操作信号并通过槽函数进行响应。同时有 QTcpSocket 类型的和 SocketUtil 类型的成员变量用于进行与服务端的 Tcp 通讯。同时提供了多个聊天窗口的管理结构 QMap 类型的成员变量。还增加了搜索用户的列表功能,在用户数量较多的情况下可以迅速锁定用户。

2.6 聊天窗体类 Chat

聊天窗体类 Chat 主要为用户提供信息发送,文件传输等功能。在下方文本编辑框 QTextEdit 中,用户可以输入并编辑所需发送的内容,点击发送按钮便可以发送消息。当需要进行文件传输时,只需点击选择文件按钮,选择要发送的文件,点击发送便可以进行文件传输。窗体类 Chat 继承自 ISOCKETSink,与 Login 类相似,主要通过对用户操作信号并通过槽函数进行响应。同时有 QTcpSocket 类型的和 SocketUtil 类型的成员变量用于进行与服务端的 Tcp 通讯,mTcpSocket 用于消息通讯,mSocket 用于文件传输。

2.7 聊天记录窗体 HistoryMessage 类

在聊天窗口中点击历史记录按钮,便可以打开 HistoryMessage 子窗口。聊天记录窗体 HistoryMessage 类主要用于显示当前用户与所选用户的历史聊天记录。窗体类 HistoryMessage 继承自 ISOCKETSink,与 Login 类相似,主要通过对用户操作信号并通过槽函数进行响应。同时有 QTcpSocket 类型的和 SocketUtil 类型的成员变量用于进行与服务端的 Tcp 通讯。窗体类中仅有 showMessage 成员函数用于向服务器获取历史聊天记录并显示。

通讯数据格式:

为区分和实现登入、注册、聊天、获取用户列表、子窗体转换时 socket 继承、获取历史聊天记录等功能,统一规定了客户端与服务器的通讯数据格式。

数据库:

用户信息记录表 user

聊天记录记录表 chat

关键处理函数:

重写 QTcpServer 类函数 incomingConnection,实现服务器对 socket 句柄的记录和管理,为转发操作建立基础。

文件传输函数,使用 tcp 协议发送所选文件。

文件接收函数,实现数据的接收和新文件在磁盘上的初始化和写入。

项目操作流程:

  1. 首先打开 server.exe,点击“打开聊天服务”和“打开文件服务”,剩下的服务端就不用动了,处于打开状态,继续客户端操作。
  2. 客户端打开 client.exe,进入登录界面。点击注册,注册完成后返回登录界面进行登录。
  3. 登录成功后可以看到在线用户列表(服务端推送实时刷新),“在线用户列表”界面,搜索框输入要搜索的用户,即可高亮显示被搜索用户名。
  4. 双击用户名进行聊天,支持自己给自己发送消息,输入文本消息,点击“发送消息”,即可发送文本。
  5. 支持聊天记录查看,默认同步的是从服务获得的所有时间段的聊天记录。点击选择文件按钮,即可选择任意类型文件,点击发送,即可在线发送文件。
  6. 上传完成后界面显示已发送文件名和发送成功标志。
  7. 服务端同步显示发送进度和发送成功状态。此文件发送为离线文件发送,即客户端先发送文件到服务端,服务端非同时转发,而是接受文件完成后再将此文件发送到接收端。

结论分析与体会:

本次即时通讯实验,我把计算机网络课程中学习的相关理论知识与工程实践相结合,设计并实现了 windows 平台上的即时通讯软件。

项目使用 c/s 架构,由服务器(server)和客户端(client)组成。

服务端进行数据库操作存储用户信息、聊天记录和传输文件副本等数据。同时进行客服注册、登入请求的处理与进行聊天信息和文件的转发工作。客户端提供了用户交互界面,提供有注册、登入、查看在线用户、即时聊天、查看历史记录、传输文件等功能。

项目使用 c++ 编写,主要使用了 QT c++ 库,即时通讯和文件传输使用 TCP 协议,编程主要使用 QT 提供的 QTcpServer 和 QTcpSocker 类。数据存储使用了轻量级数据库 SQLite。用户交互界面采用类似 QQ 的多窗体设计,包括注册界面、登入界面、用户列表界面、聊天界面、文件选择界面、聊天记录界面等,符合用户即时通讯软件使用习惯,提供了较好的体验。

本次实验加强了自己的软件工程化思维,自己在一次又一次工程化实践中提高了自己的代码实践能力。是对自己的一次非常有益的锻炼。在本次网络编程的过程中,加深了自己对计算机网络理论知识的理解,特别是 tcp 协议、网络层、传输层的相关内容,为今后的学习打下了坚实的基础。

上一篇:Ajax学习


下一篇:高效管理与自动化:Python在云服务中的应用