以下是一个使用QTcpSocket按行读取JSON文件并循环发送给客户端的示例代码:
#include <QtCore>
#include <QtNetwork>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QTcpServer server;
if (!server.listen(QHostAddress::Any, 1234)) {
qCritical() << "Failed to listen on port 1234";
return 1;
}
qDebug() << "Server is listening on" << server.serverAddress().toString() << ":" << server.serverPort();
QFile file("data.json");
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
qCritical() << "Failed to open data.json";
return 1;
}
QStringList messages;
while (!file.atEnd()) {
QByteArray line = file.readLine().trimmed();
if (!line.isEmpty())
messages.append(line);
}
qDebug() << "Read" << messages.count() << "messages from data.json";
int currentMessageIndex = 0;
QObject::connect(&server, &QTcpServer::newConnection, [&](){
QTcpSocket *socket = server.nextPendingConnection();
qDebug() << "New connection from" << socket->peerAddress().toString() << ":" << socket->peerPort();
QObject::connect(socket, &QTcpSocket::disconnected, [socket](){
qDebug() << "Disconnected from" << socket->peerAddress().toString() << ":" << socket->peerPort();
socket->deleteLater();
});
QObject::connect(socket, &QTcpSocket::readyRead, [=](){
while (socket->canReadLine()) {
QString line = QString::fromUtf8(socket->readLine()).trimmed();
qDebug() << "Received:" << line;
}
});
if (!messages.isEmpty()) {
QByteArray message = messages[currentMessageIndex].toUtf8() + "\n";
qDebug() << "Sending:" << message.trimmed();
socket->write(message);
currentMessageIndex = (currentMessageIndex + 1) % messages.count();
} else {
qDebug() << "No messages to send";
}
});
return a.exec();
}
这个示例程序首先启动一个QTcpServer并监听端口1234。然后它打开名为data.json的文件,并将其中的每一行解析为JSON消息,存储在一个QStringList中。
当有新的客户端连接时,它会创建一个QTcpSocket对象来处理与该客户端的通信。当从客户端接收到数据时,它会使用qDebug()输出该数据。
如果存在要发送的消息,则将下一条消息作为JSON格式发送到客户端,并将当前消息索引递增。如果没有消息可以发送,则不会发送任何东西。
注意,在此示例中,我们假设JSON文件中的每行都是有效的JSON消息。如果文件包含空行或格式不正确的行,则可能会导致问题。在实际应用中,请确保您的文件格式正确。