本篇内容介绍了“Qt网络中转服务器怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
需求场景:
手机端或者其他端可以对设备进行回控,并查看设备各种运行状态,接收报警推送等。
同时支持在局域网、广域网、互联网访问,尤其是互联网访问。
权限控制,给定账号控制授权的设备,并自动拉取设备信息。
设备不在线要给出反馈信息提示以便分析。
每个连接都有自己的唯一编号作为标识符。
可以方便的拓展为微信接入+小程序接入+web接入。
#include "tcpserver1.h" #include "quiwidget.h" TcpClient1::TcpClient1(QObject *parent) : QTcpSocket(parent) { ip = "127.0.0.1"; port = 6907; deviceID = "SSJC00000001"; connect(this, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(deleteLater())); connect(this, SIGNAL(disconnected()), this, SLOT(deleteLater())); connect(this, SIGNAL(readyRead()), this, SLOT(readData())); } void TcpClient1::setIP(const QString &ip) { this->ip = ip; } QString TcpClient1::getIP() const { return this->ip; } void TcpClient1::setPort(int port) { this->port = port; } int TcpClient1::getPort() const { return this->port; } QString TcpClient1::getDeviceID() { return this->deviceID; } void TcpClient1::readData() { QByteArray data = this->readAll(); if (data.length() <= 0) { return; } //取出唯一标识符,并过滤,可自行更改过滤条件 QByteArray cmd = data.mid(App::CmdStart1, App::CmdLen1); QString id = QString(cmd); if (id.startsWith("S") && deviceID != id) { deviceID = id; //发送信号更新标识符 emit receiveDeviceID(ip, port, deviceID); } QString buffer; if (App::HexData1) { buffer = QUIHelper::byteArrayToHexStr(data); } else { buffer = QString(data); } emit receiveData(ip, port, deviceID, buffer); } void TcpClient1::sendData(const QString &data) { QByteArray buffer; if (App::HexData1) { buffer = QUIHelper::hexStrToByteArray(data); } else { buffer = data.toLatin1(); } this->write(buffer); emit sendData(ip, port, deviceID, data); } TcpServer1::TcpServer1(QObject *parent) : QTcpServer(parent) { } #if (QT_VERSION > QT_VERSION_CHECK(5,0,0)) void TcpServer1::incomingConnection(qintptr handle) #else void TcpServer1::incomingConnection(int handle) #endif { TcpClient1 *client = new TcpClient1(this); client->setSocketDescriptor(handle); connect(client, SIGNAL(disconnected()), this, SLOT(disconnected())); connect(client, SIGNAL(sendData(QString, int, QString, QString)), this, SIGNAL(sendData(QString, int, QString, QString))); connect(client, SIGNAL(receiveData(QString, int, QString, QString)), this, SIGNAL(receiveData(QString, int, QString, QString))); connect(client, SIGNAL(receiveDeviceID(QString, int, QString)), this, SIGNAL(receiveDeviceID(QString, int, QString))); QString ip = client->peerAddress().toString(); int port = client->peerPort(); QString deviceID = client->getDeviceID(); client->setIP(ip); client->setPort(port); emit clientConnected(ip, port, deviceID); emit sendData(ip, port, deviceID, "客户端上线"); //追加到链表中 clients.append(client); } void TcpServer1::disconnected() { TcpClient1 *client = (TcpClient1 *)sender(); QString ip = client->getIP(); int port = client->getPort(); QString deviceID = client->getDeviceID(); emit clientDisconnected(ip, port, deviceID); emit sendData(ip, port, deviceID, "客户端下线"); //断开连接后从链表中移除 clients.removeOne(client); } bool TcpServer1::start() { #if (QT_VERSION > QT_VERSION_CHECK(5,0,0)) bool ok = listen(QHostAddress::AnyIPv4, App::ListenPort1); #else bool ok = listen(QHostAddress::Any, App::ListenPort1); #endif return ok; } void TcpServer1::stop() { foreach (TcpClient1 *client, clients) { client->disconnectFromHost(); } this->close(); } bool TcpServer1::writeData(const QString &deviceID, const QString &data) { bool ok = false; foreach (TcpClient1 *client, clients) { if (client->getDeviceID() == deviceID) { client->sendData(data); ok = true; } } return ok; }
“Qt网络中转服务器怎么实现”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。