我正在设计和制作一个服务器,它应该能够每秒处理大约 100 次以上的点击。我从服务器获取的信息只是 HTTP 标头。根据标头中的信息,它将查询数据库(不同线程)中的某些信息,并将最终信息发送回 QTcpServer,QTcpServer 创建输出字符串,然后发回 HTTP 响应。我遇到了一个无法调试的大问题。我的代码看起来与此类似:
TCPInterface::TCPInterface(QObject *parent): QTcpServer(parent)
{
//start listening for tcp traffic on port 80
listen(QHostAddress::Any, 80);
connect(this,SIGNAL(sendInfo(QTcpSocket*, QString *)), databaseThread, SLOT(recieveInfo(QTcpSocket*, QString*)));
connect(databaseThread, SIGNAL(sendToTCPSend(QTcpSocket *, QString *)), this, SLOT(TCPSend(QTcpSocket*, QString*)));
}
`
void TCPInterface::incomingConnection(int socket)
{
QTcpSocket *s = new QTcpSocket(this);
connect(s, SIGNAL(readyRead()), this, SLOT(readClient()));
//connect(s, SIGNAL(disconnected()), this, SLOT(discardClient()));
s->setSocketDescriptor(socket);
}
`
//void TCPInterface::discardClient()
//{
//QTcpSocket* socket = (QTcpSocket*)sender();
//socket->deleteLater();
//}
`
void TCPInterface::readClient()
{
QTcpSocket* socket = (QTcpSocket*)sender();
QString header;
while(socket->canReadLine())
{
header += socket->readLine();
}
emit sendInfo(socket, headerInfo);
}
`
void databaseThread::recieveInfo(QTcpSocket* socket, QString* headerInfo)
{
QString*outputInfo = getDatabaseInfo(headerInfo);
emit sendToTCPSend(socket, outputInfo);
}
`
void TCPInterface::TCPSend(QTcpSocket* socket, QString* outputInfo);
{
QString response = "HTTP/1.0 200 Ok\r\n";
response += "Content-Type: text/html; charset=\"utf-8\"\r\n";
response += "\r\n" + *outputInfo + "\n";
if(socket->isWritable() && socket->isOpen())
{
socket->write(response.toAscii());
}
//socket->disconnectFromHost();
socket->close();
delete headerInfo;
}
我有一个主要问题,我知道它是什么,但找不到解决方案。
我的问题是,随着点击次数的增加,我的记忆力也在不断增加。我确信这是因为我的 QTcpSockets 永远不会被删除,因为我只是关闭它们。但是,当我不使用 close 并使用detachFromHost 和disconnected/discardClient slot/signal 时,我的服务器将因流量大而崩溃(没有消息或任何内容,所以我不确定崩溃的确切原因)。以前有人遇到过这个问题吗?任何想法都可以。