下面是一个使用Qt 5.15编写的基于QTcpServer的高并发服务器示例代码:
#include <QtCore>
#include <QtNetwork>
class TcpServer : public QTcpServer
{
Q_OBJECT
public:
explicit TcpServer(QObject *parent = nullptr)
: QTcpServer(parent)
{
}
protected:
void incomingConnection(qintptr socketDescriptor) override
{
// 创建新的TcpSocket对象来处理连接
TcpSocket *socket = new TcpSocket(this);
connect(socket, &TcpSocket::disconnected, socket, &TcpSocket::deleteLater);
if (socket->setSocketDescriptor(socketDescriptor)) {
// 在这里进行具体的业务逻辑处理
// ...
qDebug() << "New connection established: " << socket->peerAddress().toString();
// 将socket加入到EventLoop中处理事件循环
QEventLoop *eventLoop = new QEventLoop(this);
connect(socket, &TcpSocket::readyRead, eventLoop, &QEventLoop::quit);
connect(socket, &TcpSocket::disconnected, eventLoop, &QEventLoop::quit);
while (socket->state() == QTcpSocket::ConnectedState) {
eventLoop->exec(); // 等待可读事件或断开连接事件
if (socket->bytesAvailable() > 0) {
// 处理接收到的数据,可以在这里进行解析、响应等操作
QByteArray data = socket->readAll();
qDebug() << "Received data: " << data;
// 发送响应数据给客户端
socket->write("Hello from server!");
socket->waitForBytesWritten();
}
}
qDebug() << "Connection closed: " << socket->peerAddress().toString();
} else {
// 错误处理
delete socket;
}
}
};
class TcpSocket : public QTcpSocket
{
Q_OBJECT
public:
explicit TcpSocket(QObject *parent = nullptr)
: QTcpSocket(parent)
{
}
};
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();
}
这个示例代码展示了如何创建一个基于QTcpServer的高并发服务器。在incomingConnection()函数中,每当有新连接时,会创建一个新的TcpSocket对象来处理连接,并将其加入事件循环(EventLoop)中。然后可以在readyRead信号的槽函数中处理接收到的数据,并通过write()方法发送响应数据给客户端。
请注意,这只是一个简单示例,实际情况下还需要根据具体业务需求进行适当修改和扩展。同时,为了更好地处理高并发请求,你可能需要使用多线程、线程池或者其他技术手段进行优化。
内容由零声教学AI助手提供,问题来源于学员提问