QtC++链接服务器

公司要求开发Mes软件,主要功能是上传机器数据到服务器。研究了一下Qt自带的network库,写了一段代码,能正常和服务器交互,代码如下

#include<QNetworkRequest>
#include<QNetworkReply>
#include<QUrl>
#include <QNetworkAccessManager>

MyWidget::MyWidget(QWidget *parent)
	: QFrame(parent)
{
	ui.setupUi(this);
	m_manager = new QNetworkAccessManager(this);
	connect(m_manager, &QNetworkAccessManager::finished, this, &ProductionWidget::onFinished, Qt::DirectConnection);
}


MyWidget::~MyWidget()
{
	delete m_manager; 
}


void MyWidget::onFinished(QNetworkReply* reply)
{
	if (reply->error()) {
		std::cout <<"Post Error:" << reply->errorString().toStdString() << std::endl;
	}
	else {
		std::cout <<"Post:" << reply->readAll().toStdString() << std::endl;
	}
}


void MyWidget::sendToWebservice(QString interface_address, QString data)
{
	QUrl url(interface_address);
	// 发送POST请求
	QNetworkRequest request(url);
	request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
	QNetworkReply* reply = m_manager->post(request, data.toUtf8());
}


调用sendToWebservice("服务器地址","发送数据")接口就可以上传数据到服务器。
服务器返回的数据通过信号槽调用onFinished(),通过reply->readAll()获取服务器返回值。

在自己电脑上调试一切正常,但是客户是使用内网,使用与服务器能否正常交互还需要现场人员测试。果然,不出意外地出意外了。

现场人员反馈刚开始用wifi很正常,Mes和服务器交互正常。但是考虑到要将图片,csv也放到服务器,wifi就太慢了,也不稳定,于是改成网线。Mes就提示无法链接服务器,一直报链接超时。

研究了一下发现Qt的QNetworkAccessManager有个机制,如果链接失败,NetworkAccessibility状态会置为NotAccessible,于是网络正常后也无法和服务器交互。

m_manager = new QNetworkAccessManager(this);
if (m_manager->networkAccessible() == QNetworkAccessManager::NotAccessible) {
	m_manager->setNetworkAccessible(QNetworkAccessManager::Accessible);
}
connect(m_manager, &QNetworkAccessManager::finished, this, &ProductionWidget::onFinished, Qt::DirectConnection);

新增一个判断,改为这样后就正常了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值