一个使用QtUdpSocket的简单通信c / s应用程序

A simple communicate c/s app using QtUdpSocket

本文关键字:通信 简单 应用程序 QtUdpSocket 一个      更新时间:2023-10-16

我是Qt的初学者,我想使用QUdpSocket编写一个没有GUI的服务器应用程序。我已经编写了客户端 GUI 应用程序和服务器 GUI 应用程序。他们工作得很好。但是没有GUI的服务器不能很好地工作。

我尝试使用 while(true( 循环使应用程序运行,因为我认为在代码"返回 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的服务器应用程序时,我发现服务器无法从客户端获取消息。这是我的服务器.cpp没有 GUI:

#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";
    }
}

我尝试了很多次,我认为问题主要出在我的.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!!!
}

在GUI应用程序中,如果我不关闭窗口,服务器应用程序将始终运行,并且SIGNAL和插槽我可以理解。但是在控制台应用程序中,应用程序似乎结束得很快,无法从客户端获取消息(无法显示消息(。

你的主while(true)不应该有,否则,你实际上只是冻结你的线程和Qt应用程序。这正是app.exec();的用途,它将在您的应用程序关闭时返回(更多详细信息在这里(

如果您的应用程序(带或不带 GUI(在调用 app.exec() 后关闭,这是由于以下原因之一:

  • 您正在手动关闭它,例如使用qApp->quit();
  • 您正在强制退出,例如exit(1);
  • 致命错误或异常会提前终止应用程序