下面是一个使用线程池的Qt 5.15高并发服务器示例代码:
#include <QtCore>
#include <QtNetwork>
class TcpServer : public QTcpServer
{
Q_OBJECT
public:
explicit TcpServer(QObject *parent = nullptr)
: QTcpServer(parent)
{
}
protected:
void incomingConnection(qintptr socketDescriptor) override
{
// 将新连接的socket描述符交给线程池处理
QThreadPool::globalInstance()->start(new ClientHandler(socketDescriptor));
}
};
class ClientHandler : public QObject, public QRunnable
{
Q_OBJECT
public:
explicit ClientHandler(qintptr socketDescriptor, QObject *parent = nullptr)
: QObject(parent), m_socketDescriptor(socketDescriptor)
{
}
protected:
void run() override
{
// 创建TcpSocket对象来处理连接
TcpSocket socket;
if (socket.setSocketDescriptor(m_socketDescriptor)) {
// 在这里进行具体的业务逻辑处理
// ...
qDebug() << "New connection established: " << socket.peerAddress().toString();
while (socket.state() == QTcpSocket::ConnectedState) {
if (!socket.waitForReadyRead()) {
break;
}
// 处理接收到的数据,可以在这里进行解析、响应等操作
QByteArray data = socket.readAll();
qDebug() << "Received data: " << data;
// 发送响应数据给客户端
socket.write("Hello from server!");
socket.waitForBytesWritten();
}
qDebug() << "Connection closed: " << socket.peerAddress().toString();
} else {
// 错误处理
qWarning() << "Failed to create socket for descriptor: " << m_socketDescriptor;
}
deleteLater(); // 任务完成后自动销毁
}
private:
qintptr m_socketDescriptor;
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
TcpServer server;
if (!server.listen(QHostAddress::Any, 1234)) {
qDebug() << "Failed to start server!";
return -1;
}
qDebug() << "Server started! Listening on port 1234...";
return a.exec();
}
在这个示例中,我们使用线程池来处理并发连接。当有新的连接时,将socket描述符交给线程池中的可用线程进行处理。每个线程会执行ClientHandler类的run()方法,该方法实现了具体的业务逻辑处理。
在ClientHandler中创建TcpSocket对象,并将其与socket描述符关联起来。然后,在一个循环中不断等待并处理接收到的数据。接收到数据后,可以在这里进行解析、响应等操作,并通过write()方法发送响应数据给客户端。
请注意,由于每个连接都会分配一个独立的线程处理,因此需要根据系统资源和需求来合理设置线程池大小。同样地,你可能还需要对代码进行进一步优化以满足高并发请求的需求。
内容由零声教学AI助手提供,问题来源于学员提问