以下是一个简单的使用线程池的 Qt 高并发服务器示例:
#include <QtCore>
#include <QtNetwork>
// 自定义线程类,用于处理客户端连接
class ClientThread : public QThread
{
Q_OBJECT
public:
explicit ClientThread(qintptr socketDescriptor, QObject *parent = nullptr)
: QThread(parent), m_socketDescriptor(socketDescriptor)
{
}
protected:
void run() override
{
QTcpSocket client;
if (!client.setSocketDescriptor(m_socketDescriptor)) {
emit error(client.error());
return;
}
// 处理客户端连接逻辑
// ...
client.disconnectFromHost();
if (client.state() != QAbstractSocket::UnconnectedState) {
client.waitForDisconnected();
}
}
signals:
void error(QTcpSocket::SocketError socketError);
private:
qintptr m_socketDescriptor;
};
// 自定义服务器类,管理线程池和接受客户端连接
class Server : public QObject
{
Q_OBJECT
public:
explicit Server(QObject *parent = nullptr)
: QObject(parent), m_threadPool(new QThreadPool(this))
{
m_server = new QTcpServer(this);
connect(m_server, &QTcpServer::newConnection, this, &Server::handleNewConnection);
if (!m_server->listen(QHostAddress::Any, 1234)) {
qDebug() << "Failed to start server:" << m_server->errorString();
return;
}
qDebug() << "Server started on port" << m_server->serverPort();
}
private slots:
void handleNewConnection()
{
while (m_server->hasPendingConnections()) {
auto socket = m_server->nextPendingConnection();
// 创建新线程处理客户端连接
auto clientThread = new ClientThread(socket->socketDescriptor(), this);
connect(clientThread, &ClientThread::finished, clientThread, &QObject::deleteLater);
connect(clientThread, &ClientThread::error, this, &Server::handleError);
m_threadPool->start(clientThread);
}
}
void handleError(QTcpSocket::SocketError socketError)
{
qDebug() << "Socket error:" << socketError;
}
private:
QTcpServer *m_server;
QThreadPool *m_threadPool;
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Server server;
return a.exec();
}
#include "main.moc"
这个示例中,ClientThread
类继承自 QThread
,用于处理客户端连接。在 run()
函数中,可以编写逻辑来处理客户端的请求和响应。
Server
类作为服务器的管理类,在构造函数中创建了一个 QTcpServer
对象,并监听指定的主机地址和端口。当有新的连接时,通过线程池创建一个新的 ClientThread
线程对象来处理客户端连接。
请注意,这只是一个简单示例,并未完整实现业务逻辑和错误处理。你可能需要根据具体需求进行修改和扩展。
内容由零声教学AI助手提供,问题来源于学员提问