Qt版本为5.14.2,系统环境是Linux,程序是打算监听HTTP请求进行响应,代码如下
// TcpServer.cpp
#include <QTcpSocket>
#include <QDebug>
TcpServer::TcpServer()
{
sql = new SqlOperation();
}
void TcpServer::initConnect(quint16 port = 0)
{
tcpServer = new QTcpServer(this);
tcpServer->listen(QHostAddress::Any, port);
if (!tcpServer->isListening())
{
qDebug() << "Failed to connect to server.";
return;
}
qDebug() << "Connecting to the server successfully.";
qDebug() << "Listening...";
connect(tcpServer, &QTcpServer::newConnection, this, [ = ]()
{
QTcpSocket * tcpSocket = tcpServer->nextPendingConnection();
ThreadSocket* threadSocket = new ThreadSocket(tcpSocket, sql);
threadSocket->start();
});
}
// ThreadSocket.cpp
ThreadSocket::ThreadSocket(QTcpSocket* socket, SqlOperation* sql, QObject *parent) : QThread(parent)
{
tcpSocket = socket;
this->sql = sql;
}
void ThreadSocket::run()
{
connect(tcpSocket, &QTcpSocket::readyRead, [ = ]()
{
qDebug() << "A new request.";
QByteArray byteData = tcpSocket->readAll();
QByteArray data = QByteArray::fromPercentEncoding(byteData);
qDebug() << data;
tcpSocket->write("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n");
tcpSocket->close();
qDebug() << "Response over.";
});
}
大致逻辑是监听请求连接,之后创建线程将QTcpSocket传入线程,线程接监听ReadyRead信号,并且完成响应。
目前出现的问题是ReadyRead信号并没有被触发,尝试过可能是线程还未被执行就结束了的情况,给线程添加exec()并无效果
如果所有代码都在主线程下执行,ReadyRead却可以正常触发。