公司要求开发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);
新增一个判断,改为这样后就正常了。