有qt写一段大妈两台上位机分别控制两台下位机,同一时刻两台上位机只能有一台能够控制
时间: 2024-03-08 11:46:15 浏览: 18
下面是一段基于 Qt 的示例代码,实现两台上位机分别控制两台下位机,同一时刻只允许一台上位机控制:
```c++
#include <QTcpSocket>
#include <QTcpServer>
#include <QObject>
#include <QList>
class Server : public QTcpServer
{
Q_OBJECT
public:
Server(QObject* parent = 0);
private slots:
void processNewConnection();
void processReadyRead();
void removeClient();
private:
QList<QTcpSocket*> clients;
QTcpSocket* currentClient;
};
Server::Server(QObject* parent)
: QTcpServer(parent)
{
currentClient = NULL;
}
void Server::processNewConnection()
{
QTcpSocket* client = nextPendingConnection();
connect(client, SIGNAL(readyRead()), this, SLOT(processReadyRead()));
connect(client, SIGNAL(disconnected()), this, SLOT(removeClient()));
clients.append(client);
qDebug() << "New client connected";
}
void Server::processReadyRead()
{
QTcpSocket* client = qobject_cast<QTcpSocket*>(sender());
if (client == NULL)
return;
QString message = client->readAll();
if (message == "request_control")
{
// Check if there is already a client controlling
if (currentClient != NULL && currentClient != client)
{
qDebug() << "Client rejected: another client is controlling";
client->write("rejected");
return;
}
// Grant control to this client
currentClient = client;
qDebug() << "Client granted control";
client->write("granted");
}
else if (message == "release_control")
{
// Release control from this client
currentClient = NULL;
qDebug() << "Client released control";
}
}
void Server::removeClient()
{
QTcpSocket* client = qobject_cast<QTcpSocket*>(sender());
if (client == NULL)
return;
clients.removeOne(client);
if (client == currentClient)
currentClient = NULL;
qDebug() << "Client disconnected";
}
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
Server server;
if (!server.listen(QHostAddress::Any, 1234))
{
qDebug() << "Failed to start server";
return 1;
}
qDebug() << "Server listening on port 1234";
return app.exec();
}
```
上面的代码中,`Server` 类继承自 `QTcpServer`,用于监听客户端连接。当有新的客户端连接时,`Server::processNewConnection()` 方法会被调用,将客户端 Socket 添加到 `clients` 列表中,并连接 `readyRead()` 和 `disconnected()` 信号到相应的槽函数。`Server::processReadyRead()` 方法用于处理客户端发送的请求,如果请求是 `request_control`,则检查是否已经有客户端在控制,如果有,则拒绝请求,否则允许请求,并将 `currentClient` 设置为当前客户端。如果请求是 `release_control`,则释放控制权。`Server::removeClient()` 方法用于移除客户端 Socket,并将其从 `clients` 列表中删除。
在主函数中,创建 `Server` 实例,监听端口 1234,然后启动 Qt 事件循环。
注意:这只是一个简单的示例代码,实际应用中还需要考虑异常情况的处理,例如客户端连接断开、网络异常等。