基于Qt的多用户聊天室:使用TCP线程和数据库

想用Qt创建一个属于你自己的多用户聊天室吗?这篇文章将带你一步步实现!我们将使用TCP线程处理多个客户端的连接,并使用数据库持久化聊天记录。

代码示例

以下是一个简单的基于Qt、TCP线程和数据库的多用户聊天室示例:cpp#include #include #include

class ChatServer : public QTcpServer { Q_OBJECTpublic: ChatServer(QObject* parent = nullptr) : QTcpServer(parent) {}

protected: void incomingConnection(qintptr socketDescriptor) override { ChatThread* thread = new ChatThread(socketDescriptor, this); connect(thread, &QThread::finished, thread, &QObject::deleteLater); thread->start(); }};

class ChatThread : public QThread { Q_OBJECTpublic: ChatThread(qintptr socketDescriptor, QObject* parent = nullptr) : QThread(parent), socketDescriptor(socketDescriptor) {}

void run() override {        QTcpSocket socket;        if (!socket.setSocketDescriptor(socketDescriptor)) {            emit error(socket.error());            return;        }

    connect(&socket, &QIODevice::readyRead, this, &ChatThread::readData);        connect(&socket, &QAbstractSocket::disconnected, this, &ChatThread::disconnected);

    exec();    }

signals: void error(QAbstractSocket::SocketError socketError); void messageReceived(const QString& message); void disconnected();

private slots: void readData() { QTcpSocket* socket = qobject_cast<QTcpSocket*>(sender()); if (!socket) return;

    while (socket->canReadLine()) {            QString message = QString::fromUtf8(socket->readLine()).trimmed();                        // 处理消息,例如将其保存到数据库                        emit messageReceived(message);        }    }};

class ChatClient : public QObject { Q_OBJECTpublic: ChatClient(QObject* parent = nullptr) : QObject(parent) { socket.connectToHost('localhost', 12345); connect(&socket, &QIODevice::readyRead, this, &ChatClient::readData); }

void sendMessage(const QString& message) {        if (socket.state() == QAbstractSocket::ConnectedState) {            socket.write(message.toUtf8());            socket.flush();        }    }

signals: void messageReceived(const QString& message);

private slots: void readData() { while (socket.canReadLine()) { QString message = QString::fromUtf8(socket.readLine()).trimmed(); emit messageReceived(message); } }

private: QTcpSocket socket;};

int main(int argc, char* argv[]) { QApplication app(argc, argv);

// 连接数据库    QSqlDatabase db = QSqlDatabase::addDatabase('QSQLITE');    db.setDatabaseName('chat.db');    if (!db.open()) {        qDebug() << 'Failed to open database';        return -1;    }

// 创建聊天记录表    QSqlQuery query;    query.exec('CREATE TABLE IF NOT EXISTS messages (id INTEGER PRIMARY KEY AUTOINCREMENT, content TEXT)');

// 创建服务器    ChatServer server;    if (!server.listen(QHostAddress::Any, 12345)) {        qDebug() << 'Failed to start server';        return -1;    }

// 创建客户端    ChatClient client;

// 创建UI    QWidget window;    QVBoxLayout* layout = new QVBoxLayout(&window);    QTextEdit* chatBox = new QTextEdit(&window);    QLineEdit* inputBox = new QLineEdit(&window);    layout->addWidget(chatBox);    layout->addWidget(inputBox);

QObject::connect(&client, &ChatClient::messageReceived, [&](const QString& message) {        chatBox->append('Received: ' + message);    });

QObject::connect(inputBox, &QLineEdit::returnPressed, [&]() {        QString message = inputBox->text();        chatBox->append('Sent: ' + message);        client.sendMessage(message);        inputBox->clear();    });

window.show();

return app.exec();}

#include 'main.moc'

代码说明

  1. ChatServer: 负责监听客户端连接请求,每当有新的连接请求到来时,创建一个 ChatThread 线程来处理该连接。

  2. ChatThread: 每个线程负责与一个客户端进行通信,接收客户端发送的消息,并将消息广播给其他客户端。

  3. ChatClient: 客户端程序,负责连接服务器、发送消息和接收消息。

  4. 数据库: 使用SQLite数据库来存储聊天记录,可以替换为其他数据库,如MySQL,PostgreSQL等。

拓展

这个例子可以根据你的需求进行修改和扩展,例如:

  • 添加用户登录注册功能* 实现私聊功能* 使用更美观的UI库设计界面* 增加文件传输功能

希望这篇教程能够帮助你理解如何使用Qt创建多用户聊天室!

基于Qt的多用户聊天室:使用TCP线程和数据库

原文地址: https://www.cveoy.top/t/topic/b0hk 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录