基于Qt的多用户聊天室:使用TCP线程和数据库
基于Qt的多用户聊天室:使用TCP线程和数据库
想用Qt创建一个属于你自己的多用户聊天室吗?这篇文章将带你一步步实现!我们将使用TCP线程处理多个客户端的连接,并使用数据库持久化聊天记录。
代码示例
以下是一个简单的基于Qt、TCP线程和数据库的多用户聊天室示例:cpp#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'
代码说明
-
ChatServer: 负责监听客户端连接请求,每当有新的连接请求到来时,创建一个
ChatThread线程来处理该连接。 -
ChatThread: 每个线程负责与一个客户端进行通信,接收客户端发送的消息,并将消息广播给其他客户端。
-
ChatClient: 客户端程序,负责连接服务器、发送消息和接收消息。
-
数据库: 使用SQLite数据库来存储聊天记录,可以替换为其他数据库,如MySQL,PostgreSQL等。
拓展
这个例子可以根据你的需求进行修改和扩展,例如:
- 添加用户登录注册功能* 实现私聊功能* 使用更美观的UI库设计界面* 增加文件传输功能
希望这篇教程能够帮助你理解如何使用Qt创建多用户聊天室!
原文地址: https://www.cveoy.top/t/topic/b0hk 著作权归作者所有。请勿转载和采集!