Я новичок в 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!!!
}
В приложении с графическим интерфейсом, если я не закрываю окна, приложение сервера всегда будет работать, и СИГНАЛ и СЛОТ я могу понять. Но в консольном приложении кажется, что приложение заканчивается быстро и не может получить сообщение от клиента (не может отобразить сообщение).