Простое приложение для общения с использованием QtUdpSocket - PullRequest
1 голос
/ 23 марта 2019

Я новичок в Qt. Я хочу использовать QUdpSocket для написания серверного приложения без GUI. Я написал клиентское приложение GUI и серверное приложение GUI. Они работают хорошо. Но сервер без GUI не работает хорошо .

Я пытаюсь использовать цикл while (true), чтобы приложение работало, потому что я думаю, что после кода 'return a.exec ()' приложение остановится. Но мое серверное приложение не работает.

Вот мой код: клиент с графическим интерфейсом:

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    socket=new QUdpSocket(this);
    //click pushbutton send message to server
    connect(this->ui->pushButton,SIGNAL(clicked()),this,SLOT(send()));
}

Widget::~Widget()
{
    delete ui;
}
//send message
void Widget::send()
{
    QByteArray msg="client2:hello world"; 
    socket->writeDatagram(msg.data(),msg.size(),QHostAddress::LocalHost,6666);
}

Клиентское приложение и сервер с приложением GUI могут работать хорошо. Но когда я пытаюсь создать серверное приложение без GUI, я обнаружил, что сервер не может получить сообщение от клиента. А вот мой server.cpp без графического интерфейса:

#include "server.h"

Server::Server(QObject *parent) : QObject(parent)
{
    socket=new QUdpSocket(this);
    array=new QByteArray();
    socket->bind(QHostAddress::LocalHost,6666,QAbstractSocket::DontShareAddress);
    socket->open(QIODevice::ReadWrite); //without this line, the app will show:
//'QIOBevice::read(QUdpSocket):device not open',but it still can get the message from client.
    connect(socket,SIGNAL(readyRead()),this,SLOT(printMsg()));
}

void Server::printMsg()
{
    if(socket->hasPendingDatagrams()) //I forgot this line before.
    {
        array->resize(socket->pendingDatagramSize());
        socket->readDatagram(array->data(),array->size());
        socket->readAll();
        qDebug()<<"yesyesyes";
    }
}

Я пытаюсь много раз, я думаю, проблема в моем main.cpp:

#include <QCoreApplication>
#include "server.h"
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    Server s;

    return a.exec();//after a.exec(),the app is still working!!!
}

В приложении с графическим интерфейсом, если я не закрываю окна, приложение сервера всегда будет работать, и СИГНАЛ и СЛОТ я могу понять. Но в консольном приложении кажется, что приложение заканчивается быстро и не может получить сообщение от клиента (не может отобразить сообщение).

1 Ответ

0 голосов
/ 24 марта 2019

У вас не должно быть while(true) в вашем главном, в противном случае вы фактически просто замораживаете свой поток и приложение Qt.Это именно то, для чего app.exec();, он вернется, когда ваше приложение будет закрыто (подробнее здесь )

Если ваше приложение (с или без GUI) закрывается после вызова app.exec(), это связано с одним из следующих действий:

  • Вы закрываете его вручную, например, с помощью qApp->quit();
  • Вы форсируете выход, например, с помощью exit(1);
  • Фатальная ошибка или исключение преждевременно завершает ваше приложение
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...