用qt写一段socket代理层的代码实现两个上位机同时连接一台下位机,并将下位机的数据呈现在上位机上
时间: 2024-03-15 14:45:58 浏览: 96
高分项目,QT上位机,QT四轴上位机初级版,内含完整源代码+下位机协议
好的,这是一个可以实现两个上位机同时连接一台下位机,并将下位机的数据呈现在上位机上的Qt socket代理层代码:
```cpp
#include <QtNetwork>
#include <QTcpServer>
#include <QTcpSocket>
class ProxyServer : public QTcpServer {
Q_OBJECT
public:
ProxyServer(QObject *parent = nullptr) : QTcpServer(parent) {}
protected:
void incomingConnection(qintptr socketDescriptor) override {
QTcpSocket *client = new QTcpSocket(this);
if (!client->setSocketDescriptor(socketDescriptor)) {
return;
}
m_clients.append(client);
qDebug() << "客户端已连接:" << client->peerAddress().toString() << ":" << client->peerPort();
connect(client, &QTcpSocket::readyRead, [=]() {
QByteArray data = client->readAll();
for (auto c : m_clients) {
if (c != client) {
c->write(data);
}
}
});
connect(client, &QTcpSocket::disconnected, [=]() {
m_clients.removeOne(client);
qDebug() << "客户端已断开:" << client->peerAddress().toString() << ":" << client->peerPort();
});
}
private:
QList<QTcpSocket*> m_clients;
};
int main(int argc, char **argv) {
QCoreApplication app(argc, argv);
ProxyServer server;
if (!server.listen(QHostAddress::Any, 8888)) {
qDebug() << "无法启动服务:" << server.errorString();
return -1;
}
qDebug() << "服务已启动,端口号为:8888";
return app.exec();
}
```
这段代码中,我们创建了一个名为ProxyServer的类,继承自QTcpServer。在这个类中,我们实现了incomingConnection()方法,用于处理客户端的连接请求。
当客户端(上位机或下位机)连接到代理服务器时,会触发incomingConnection()方法。在这个方法中,我们创建一个QTcpSocket对象,用于与客户端通信。如果连接失败,则会返回错误信息。
当客户端连接成功后,会提示“客户端已连接”。
我们监听了客户端发送的数据,将下位机的数据发送给所有上位机。这里使用了一个QList<QTcpSocket*>类型的列表,用于保存所有的客户端(上位机和下位机)连接。
当客户端断开连接时,会从列表中移除。
最后,我们在main()函数中创建并启动代理服务器。如果启动失败,则会返回错误信息。如果启动成功,则会提示“服务已启动,端口号为:8888”。
这段代码的实现过程比较简单,但是其中涉及到的知识点还是比较多的。如果你有什么问题,可以随时向我提问。
阅读全文