用qt写一段代码通过socket让两台上位机通过同一个端口号连同一个下位机,两台上位机能同时获取数据,但同一时刻只能有一台上位机对下位机进行控制
时间: 2024-03-16 22:45:06 浏览: 90
以下是一个基于Qt的实现,可以通过socket让两台上位机通过同一个端口号连接到同一个下位机,并实现同一时刻只能有一台上位机对下位机进行控制的功能:
```cpp
// main.cpp
#include <QCoreApplication>
#include <QTcpServer>
#include <QTcpSocket>
QTcpServer* server;
QTcpSocket* client1;
QTcpSocket* client2;
QTcpSocket* robot;
bool isClient1Control = false;
bool isClient2Control = false;
void onClient1DataReceived()
{
QByteArray data = client1->readAll();
if (isClient1Control)
{
// 处理Client1发来的控制命令
// ...
}
else
{
// 将Client1发来的数据发送给Client2
client2->write(data);
}
}
void onClient2DataReceived()
{
QByteArray data = client2->readAll();
if (isClient2Control)
{
// 处理Client2发来的控制命令
// ...
}
else
{
// 将Client2发来的数据发送给Client1
client1->write(data);
}
}
void onRobotDataReceived()
{
QByteArray data = robot->readAll();
// 将下位机发来的数据发送给两个客户端
client1->write(data);
client2->write(data);
}
void onClient1Control()
{
// Client1请求控制下位机
isClient1Control = true;
isClient2Control = false;
}
void onClient2Control()
{
// Client2请求控制下位机
isClient1Control = false;
isClient2Control = true;
}
void onControlRelease()
{
// 释放控制权
isClient1Control = false;
isClient2Control = false;
}
void onClient1Disconnected()
{
// Client1断开连接
client1->deleteLater();
}
void onClient2Disconnected()
{
// Client2断开连接
client2->deleteLater();
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 创建TCP服务器,监听端口号为9999
server = new QTcpServer(&a);
server->listen(QHostAddress::Any, 9999);
// 创建两个客户端连接
client1 = nullptr;
client2 = nullptr;
QObject::connect(server, &QTcpServer::newConnection, [&]() {
if (client1 == nullptr)
{
client1 = server->nextPendingConnection();
QObject::connect(client1, &QTcpSocket::readyRead, onClient1DataReceived);
QObject::connect(client1, &QTcpSocket::disconnected, onClient1Disconnected);
}
else if (client2 == nullptr)
{
client2 = server->nextPendingConnection();
QObject::connect(client2, &QTcpSocket::readyRead, onClient2DataReceived);
QObject::connect(client2, &QTcpSocket::disconnected, onClient2Disconnected);
}
});
// 创建下位机连接
robot = new QTcpSocket(&a);
robot->connectToHost(QHostAddress("192.168.1.100"), 8888);
QObject::connect(robot, &QTcpSocket::readyRead, onRobotDataReceived);
// 处理控制命令
QObject::connect(client1, &QTcpSocket::readyRead, onClient1Control);
QObject::connect(client2, &QTcpSocket::readyRead, onClient2Control);
QObject::connect(client1, &QTcpSocket::disconnected, onControlRelease);
QObject::connect(client2, &QTcpSocket::disconnected, onControlRelease);
return a.exec();
}
```
上述代码中,首先创建了一个TCP服务器,监听端口号为9999,并创建了两个客户端连接。当客户端连接到服务器时,会依次分配给client1和client2两个连接。同时,还创建了一个与下位机的连接,该连接监听端口号为8888,IP地址为192.168.1.100。
在数据传输时,如果客户端请求控制下位机,则isClient1Control或isClient2Control会被设置为true,此时只有该客户端可以对下位机进行控制。如果没有请求控制下位机,则数据将会被转发给另一个客户端。
在任何一个客户端断开连接时,控制权都会被释放。
阅读全文