QLocalSocket发送连续数据到QLocalServer的问题

问题描述

我试图以循环方式将一些数据从QLocalSocket发送到QLocalSever。服务器仅获取一个数据,而不接收后续数据,但是如果我在每次来自客户端的调用之间引入1 mcc延迟,则服务器将开始接收所有内容。请查看下面的客户端和服务器代码

client.cpp

#include "client.h"
#include "QDataStream"
#include <QTest>

TestClient::TestClient() : m_socket{new QLocalSocket(this)}{
    m_socket->connectToServer("TestServer");
    if (m_socket->waitForConnected(1000)) {
      qDebug("socket Connected!");
    }
    connect(m_socket,&QLocalSocket::readyRead,this,&TestClient::onNewData);
}

void TestClient::onNewData() {
    qCritical() << "data received from server";
}

void TestClient::sendDataToServer() {
    QByteArray block;
    QDataStream out(&block,qiodevice::writeonly);
    out.setVersion(QDataStream::Qt_5_10);
    QString testString = "test data";
    out << quint32(testString.size());
    out << testString;
    m_socket->write(block);
    m_socket->flush();
}

void TestClient::startClient() {
    for(int i = 0; i < 5; i++) {
        //QTest::qWait(1); //works if I uncomment this line
        sendDataToServer();
    }
}

server.cpp

#include "server.h"

TestServer::TestServer() : m_server{new QLocalServer(this)} {
    QLocalServer::removeServer("TestServer");
    if (!m_server->listen("TestServer")) {
        qCritical() << "Couldn't connect to server";
    }
    connect(m_server,&QLocalServer::newConnection,&TestServer::onNewConnection);
}

void TestServer::onNewConnection() {
    m_socket = m_server->nextPendingConnection();
    connect(m_socket,&TestServer::onNewData);
    connect(m_socket,&QLocalSocket::disconnected,m_socket,&QLocalSocket::deleteLater);
}

void TestServer::onNewData() {
    QLocalSocket* client = qobject_cast<QLocalSocket*>(sender());
    client->readAll();
    qCritical() << "data read by server";
}

从qt文档中得知,

readyRead()不会递归发出;如果您重新进入事件循环 或在连接到readyRead()的插槽内调用waitForReadyRead() 信号,该信号将不会重新发出(尽管waitForReadyRead() 可能仍会返回true)。

这是我的问题吗?添加计时器是这里唯一的解决方案?

您可以编译此测试项目-> http://www.filedropper.com/testsocket

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)