以下是一个使用Qt自带线程池实现即时通讯服务器的高并发,并且服务端和客户端保持连接状态直到客户端断开连接的示例:
#include <QCoreApplication>
#include <QTcpServer>
#include <QTcpSocket>
#include <QThreadPool>
// 自定义任务类
class ClientTask : public QObject, public QRunnable {
Q_OBJECT
public:
explicit ClientTask(qintptr socketDescriptor, QObject* parent = nullptr)
: QObject(parent), m_socketDescriptor(socketDescriptor) {}
void run() override {
QTcpSocket client;
if (!client.setSocketDescriptor(m_socketDescriptor)) {
emit error(client.error());
return;
}
// 处理客户端连接请求,保持与客户端的通信直到断开连接
qDebug() << "Client connected: " << client.peerAddress().toString();
connect(&client, &QTcpSocket::readyRead, this, [this, &client]() {
QByteArray requestData = client.readAll();
qDebug() << "Received request from client: " << requestData;
// 做一些业务处理...
// 发送回应给客户端
QByteArray responseData = requestData;
client.write(responseData);
});
connect(&client, &QTcpSocket::disconnected, this, [&client]() {
qDebug() << "Client disconnected: " << client.peerAddress().toString();
client.deleteLater();
});
}
signals:
void error(QAbstractSocket::SocketError socketError);
private:
qintptr m_socketDescriptor;
};
int main(int argc, char* argv[]) {
QCoreApplication a(argc, argv);
QTcpServer server;
if (!server.listen(QHostAddress::Any, 12345)) { // 监听所有地址的12345端口
qFatal("Failed to start the server");
}
QThreadPool threadPool; // 创建线程池对象
threadPool.setMaxThreadCount(10); // 设置最大线程数
QObject::connect(&server, &QTcpServer::newConnection, [&]() {
while (server.hasPendingConnections()) {
QTcpSocket* socket = server.nextPendingConnection();
if (socket) {
// 将客户端连接的处理任务添加到线程池中
ClientTask* task = new ClientTask(socket->socketDescriptor());
connect(task, &ClientTask::error, [&](QAbstractSocket::SocketError socketError) {
qDebug() << "Socket error: " << socketError;
task->deleteLater();
});
threadPool.start(task);
}
}
});
qDebug() << "Server started";
return a.exec();
}
#include "main.moc"
在上述示例中,我们通过自定义ClientTask
类继承自QObject和QRunnable,并重写run()方法来实现客户端连接的处理逻辑。在run()方法中,我们使用QTcpSocket来与客户端进行通信,接收客户端发送的请求并进行业务处理。当客户端断开连接时,会触发disconnected信号。
在主函数中,创建一个QTcpServer对象用于监听客户端连接,并通过设置最大线程数控制并发处理能力。当有新的客户端连接进来时,将对应的任务添加到线程池中执行。同时,我们还为任务类定义了error信号,以便在发生错误时进行处理。
这样,即时通讯服务器就能够实现高并发,并且服务端与客户端可以保持连接状态直到客户端断开连接。请注意,在实际开发中,您可能还需要处理线程安全、数据同步等问题。
内容由零声教学AI助手提供,问题来源于学员提问