一个使用QtUdpSocket的简单通信c / s应用程序
A simple communicate c/s app using QtUdpSocket
我是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);
- 致命错误或异常会提前终止应用程序
相关文章:
- 在c++中用vector填充一个简单的动态数组
- (C++)分析树以计算返回错误值的简单算术表达式
- 我的简单if-else语句是如何无法访问的代码
- 使用简单类型列表实现的指数编译时间.为什么
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 如何在BST的这个简单递归实现中消除警告
- 是否可以使用winusb同时与多个相同的usb设备进行通信
- 一种在C++中读取TXT配置文件的简单方法
- 关于简单C++函数(is_palindrome)的逻辑的问题
- 显示错误输出的简单数组排序程序
- 混淆了如何使用IDL与Ethovision进行通信
- 当无法使用模板和宏时,生成类型变体C++代码的最简单方法是什么?
- 退出简单while循环时出现问题
- 为什么简单的算术减法在"if"条件下不起作用?
- 使用boost :: asio进行简单的UDP通信
- 一个使用QtUdpSocket的简单通信c / s应用程序
- 使用UNIX套接字C++客户端与Node.js服务器通信的简单示例
- 使用Boost.ASIO与服务器进行简单的网络tcp通信
- TinyThread计数器 - 便携式c++0和c++11线程间通信变得简单
- 在 Windows 上的 C++ 中实现强大、简单(且快速)的进程间通信