目录
要求
1、发送者自定义昵称,发送消息时显示昵称和端口号;
2、同时容纳10人;
3、半双工通信;
4、聊天记录使用数据库进行存储,显示聊天记录;
示例代码片段
client端
client.pro
前面加上数据库文件sql和网络链接network,链接上图标文件。
QT += core gui network sql
RC_FILE += client_config.rc
dialog.h
client类头文件定义
#include <QtWidgets>
#include <QDialog>
// 连接类
#include <QTcpSocket>
// 文本流类
#include <QTextStream>
#include <QDateTime>
// 调试类
#include <QDebug>
// 数据库连接类
#include <QSqlDatabase>
// 弹窗信息类
#include <QMessageBox>
// 数据库错误信息类
#include <QSqlError>
// 数据库操作类
#include <QSqlQuery>
client类头文件私有成员
Ui::Dialog *ui;
// 聊天记录
QSqlDatabase db; // 声明数据库连接对象db
void connectDB(); // 连接数据库
void createTable(); // 建表
void selectAll(); // 发送聊天记录
// void printHistoryMsg(QString); // 输出内容到历史记录
QTcpSocket* client; // 连接类对象
void printMsg(QString); // 输出内容到公屏
client类头文件私有函数信号
void btnConnClickedSlot(); // 连接按钮点击的槽函数
void btnSendClickedSlot(); // 发送按钮点击的槽函数
void connectedSlot(); // 连接成功的槽函数
void disconnectedSlot(); // 连接失败的槽函数
void readReadSlot(); // 接收数据的槽函数
// void readReadHistorySlot();// 接收历史记录数据的槽函数
dialog.cpp
client类源文件函数集
继承
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
connectDB(); // 创建数据库
// 客户端窗口始终位于前台
setWindowFlags(Qt::WindowStaysOnTopHint);
// 连接与发送按钮连接对应槽函数
connect(ui->pushButtonConn,SIGNAL(clicked()),this,SLOT(btnConnClickedSlot()));
connect(ui->pushButtonSend,SIGNAL(clicked()),this,SLOT(btnSendClickedSlot()));
// 创建客户端连接类对象:client
client = new QTcpSocket(this);
// 连接与断开client对象的信号槽
connect(client,SIGNAL(connected()),this,SLOT(connectedSlot()));
connect(client,SIGNAL(disconnected()),this,SLOT(disconnectedSlot()));
// 接收消息的信号槽
connect(client,SIGNAL(readyRead()),this,SLOT(readReadSlot()));
}
连接数据库
void Dialog::connectDB()
{
db = QSqlDatabase::addDatabase("QSQLITE"); // 获得数据库连接对象
db.setDatabaseName("tcp_chat.db"); // 设置SQLite数据库文件名称
if(db.open())
{
qDebug() << "数据库连接成功";
createTable(); // 创建
//selectAll(); // 创建成功展示一次表中数值
}else
{
QSqlError info = info.text(); // 获得错误信息类对象
QString error_text = info.text(); // 提取错误信息文本内容
QMessageBox::critical(this,"数据库连接错误",error_text); // 弹窗提示
}
}
建表
void Dialog::createTable()
{
QString sql = QString("CREATE TABLE chat(user TEXT,msg TEXT,text TEXT);");
sql = "CREATE TABLE chat(user TEXT,msg TEXT,text TEXT);";
// sql操作类对象
QSqlQuery sq;
if(sq.exec(sql))
qDebug() << "建表成功";
else
{
QString err