0

I'm trying to send some data from QLocalSocket to QLocalSever in a loop. Sever only gets the first data and not receiving subsequent data, but if I introduce 1 mec delay between each call from the client then the server starts to receive everything. Please check out the below Client & Server code.

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, this, &TestServer::onNewConnection);
}

void TestServer::onNewConnection() {
    m_socket = m_server->nextPendingConnection();
    connect(m_socket, &QLocalSocket::readyRead, this,
            &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";
}

from the qt doc, it's stated that

readyRead() is not emitted recursively; if you reenter the event loop or call waitForReadyRead() inside a slot connected to the readyRead() signal, the signal will not be reemitted (although waitForReadyRead() may still return true).

so is this my problem? adding timer is the only solution here?

You can compile this test project -> http://www.filedropper.com/testsocket

Vencat
  • 1,272
  • 11
  • 36
  • Why do you think only the first chunk of data is being received by the server? Note that the data connection is just a byte stream so multiple writes by the client don't necessarily correspond to multiple reads by the server – G.M. Oct 30 '20 at 15:18
  • @G.M. Yes, I got the same answer in QT forum https://forum.qt.io/topic/120425/problem-with-qlocalsocket-sending-continues-data-to-qlocalserver . Shall I leave this question here or should I need to close it? – Vencat Oct 30 '20 at 15:33

0 Answers0