用qt写一段socket代理层的代码实现两个上位机同时连接一台下位机,并分步进行详解
时间: 2024-03-15 07:46:11 浏览: 130
用QT制作一个TCPServer的上位机与TCPClient的下位机通信
好的,以下是用Qt写的socket代理层代码实现两个上位机同时连接一台下位机的示例,并附有详细注释:
```
#include <QtNetwork>
class Proxy : public QObject
{
Q_OBJECT
public:
Proxy(QObject *parent = nullptr) : QObject(parent)
{
// 创建下位机socket,并连接到下位机
m_deviceSocket = new QTcpSocket(this);
m_deviceSocket->connectToHost("192.168.1.100", 1234);
// 创建上位机socket1,并连接到代理服务器
m_clientSocket1 = new QTcpSocket(this);
m_clientSocket1->connectToHost("localhost", 5678);
connect(m_clientSocket1, &QTcpSocket::readyRead, this, &Proxy::onReadyRead1);
connect(m_clientSocket1, &QTcpSocket::disconnected, this, &Proxy::onDisconnected1);
// 创建上位机socket2,并连接到代理服务器
m_clientSocket2 = new QTcpSocket(this);
m_clientSocket2->connectToHost("localhost", 5678);
connect(m_clientSocket2, &QTcpSocket::readyRead, this, &Proxy::onReadyRead2);
connect(m_clientSocket2, &QTcpSocket::disconnected, this, &Proxy::onDisconnected2);
}
private slots:
// 上位机socket1有数据可读,将数据转发给下位机socket
void onReadyRead1()
{
QByteArray data = m_clientSocket1->readAll();
m_deviceSocket->write(data);
}
// 上位机socket2有数据可读,将数据转发给下位机socket
void onReadyRead2()
{
QByteArray data = m_clientSocket2->readAll();
m_deviceSocket->write(data);
}
// 上位机socket1断开连接,断开下位机socket连接
void onDisconnected1()
{
m_deviceSocket->disconnectFromHost();
}
// 上位机socket2断开连接,断开下位机socket连接
void onDisconnected2()
{
m_deviceSocket->disconnectFromHost();
}
// 下位机socket有数据可读,将数据转发给所有上位机socket
void onReadyReadDevice()
{
QByteArray data = m_deviceSocket->readAll();
m_clientSocket1->write(data);
m_clientSocket2->write(data);
}
private:
QTcpSocket *m_deviceSocket;
QTcpSocket *m_clientSocket1;
QTcpSocket *m_clientSocket2;
};
```
以上代码实现了一个socket代理层,将多个上位机连接到代理服务器上,并同时转发数据到同一个下位机。下面对代码进行详细解释:
1. 首先,我们创建了一个 `Proxy` 类,并继承了 `QObject` 类。这是Qt编程的基本结构,是为了能够使用信号和槽机制。
2. 在 `Proxy` 类的构造函数中,我们创建了三个 `QTcpSocket` 对象:`m_deviceSocket`、`m_clientSocket1`、`m_clientSocket2`。其中,`m_deviceSocket` 对象连接到下位机,并在代理服务器上创建两个 `m_clientSocket1` 和 `m_clientSocket2` 对象,用于与两个上位机进行通信。
3. 对于 `m_deviceSocket` 对象,我们还需要监听它的 `readyRead` 信号,以便在下位机有数据可读时,能够将数据转发给所有上位机。为此,我们创建了 `onReadyReadDevice` 槽函数,并将其与 `m_deviceSocket` 对象的 `readyRead` 信号连接。
4. 对于 `m_clientSocket1` 和 `m_clientSocket2` 对象,我们需要分别监听它们的 `readyRead` 和 `disconnected` 信号。当它们有数据可读时,我们需要将数据转发给下位机;当它们断开连接时,我们也需要断开 `m_deviceSocket` 对象与下位机的连接。因此,我们创建了 `onReadyRead1`、`onReadyRead2`、`onDisconnected1`、`onDisconnected2` 四个槽函数,并将它们与相应的信号连接。
5. 在 `onReadyRead1` 和 `onReadyRead2` 槽函数中,我们读取上位机发来的数据,并将数据写入 `m_deviceSocket` 对象中,以便将数据转发给下位机。
6. 在 `onDisconnected1` 和 `onDisconnected2` 槽函数中,我们断开 `m_deviceSocket` 对象与下位机的连接,以防止多个上位机同时连接造成冲突。
7. 最后,在 `onReadyReadDevice` 槽函数中,我们读取下位机发来的数据,并将数据写入所有上位机连接的 `QTcpSocket` 对象中,以便将数据转发给所有上位机。
注意:以上代码仅作为示例,实际应用中还需要考虑多种错误处理和异常情况。
阅读全文