Проблема с отправкой данных в QLocalServer в качестве клиента перед закрытием - PullRequest
0 голосов
/ 21 декабря 2018

Я изучаю Qt и у меня возникают проблемы с отправкой некоторых данных в QLocalServer перед закрытием клиентского приложения.В примере я пытался отправить "пока" дважды.Но на стороне сервера я получил это только один раз.Независимо от того, сколько раз клиент отправит, если перед закрытием сервер получит только первое сообщение.Если я использую QCloseEvent, то результат такой же.Может я что-то не так делаю?Спасибо за любую помощь!

Упрощенный пример Сервер

MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        server = new QLocalServer(this);
        server->listen("Server1");
        connect(server, SIGNAL(newConnection()), this, SLOT(processNewConnection()));

    }


    void MainWindow::processNewConnection()
    {
       clientConnection = new QLocalSocket(this);
       clientConnection = server->nextPendingConnection();
       connect(clientConnection,SIGNAL(readyRead()), this, SLOT(proceessData()));
    }

    void MainWindow::proceessData()
    {
        QLocalSocket* clientSocket = (QLocalSocket*)sender();
        QByteArray recievedData;
        recievedData = clientSocket -> readAll();
    }

Вот пример Клиент

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    localSocket = new QLocalSocket(this);
    localSocket -> connectToServer("Server1");
    QByteArray hey("Hey");
    localSocket->write(hey);
}

MainWindow::~MainWindow()
{
    QByteArray bye("bye");
    localSocket->write(bye);
    localSocket->write(bye);
    delete ui;
}

1 Ответ

0 голосов
/ 22 декабря 2018

Вы должны использовать waitForBytesWritten(), чтобы убедиться, что данные передаются в базовый системный буфер перед закрытием сокета.

MainWindow::~MainWindow()
{
    QByteArray bye("bye");

    localSocket->write(bye);
    localSocket->write(bye);

    localSocket->waitForBytesWritten(); //<-- wait for data sent out.

    delete ui;
}
...