怎么实现异步请求,同步响应 以Qt为例使用Tcp 方式 给出详细代码
时间: 2024-05-11 17:16:05 浏览: 154
Qt基于QTcpSocket写的ModBusTcp模块,Qt自带的modbusTCP并不能用
5星 · 资源好评率100%
首先说一下异步请求和同步响应的概念:异步请求指的是请求发送后不等待直接继续执行下面的代码,而不是等待返回结果后再执行下面的代码;同步响应指的是请求发送后等待返回结果再继续执行下面的代码。
在Qt中使用Tcp方式实现异步请求、同步响应可以使用Qt的信号槽机制。以下是详细代码:
异步请求
```c++
void TcpClient::sendData(QByteArray data)
{
// 创建Tcp socket对象
QTcpSocket *m_socket = new QTcpSocket(this);
connect(m_socket, SIGNAL(connected()), this, SLOT(onConnected())); // 连接到服务器
connect(m_socket, SIGNAL(disconnected()), this, SLOT(onDisconnected())); // 从服务器断开连接
connect(m_socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(onError(QAbstractSocket::SocketError))); // 发生错误
m_socket->connectToHost("your_ip_address", 8888); // 连接到服务器的IP和端口号
// 发送数据
m_socket->write(data);
}
// 当连接服务器成功时,执行该函数
void TcpClient::onConnected()
{
QTcpSocket *m_socket = qobject_cast<QTcpSocket *>(sender());
if (m_socket) {
// 连接成功,可以做一些其他操作或者发送数据
}
}
// 当从服务器断开连接时,执行该函数
void TcpClient::onDisconnected()
{
QTcpSocket *m_socket = qobject_cast<QTcpSocket *>(sender());
if (m_socket) {
// 断开连接,可以做一些其他操作
m_socket->close();
m_socket->deleteLater();
}
}
// 当发生错误时,执行该函数
void TcpClient::onError(QAbstractSocket::SocketError socketError)
{
QTcpSocket *m_socket = qobject_cast<QTcpSocket *>(sender());
if (m_socket) {
qDebug() << "socket error: " << socketError;
// 发生错误,可以做一些其他操作
m_socket->close();
m_socket->deleteLater();
}
}
```
同步响应
```c++
void TcpClient::sendData(QByteArray data)
{
// 创建Tcp socket对象
QTcpSocket *m_socket = new QTcpSocket(this);
connect(m_socket, SIGNAL(connected()), this, SLOT(onConnected())); // 连接到服务器
connect(m_socket, SIGNAL(disconnected()), this, SLOT(onDisconnected())); // 从服务器断开连接
connect(m_socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(onError(QAbstractSocket::SocketError))); // 发生错误
connect(m_socket, SIGNAL(readyRead()), this, SLOT(onDataReceived())); // 接收到数据
m_socket->connectToHost("your_ip_address", 8888); // 连接到服务器的IP和端口号
// 发送数据
m_socket->write(data);
// 等待接收到服务器返回的数据
while (m_socket->waitForReadyRead()) {
QByteArray responseData = m_socket->readAll();
// 解析responseData
}
m_socket->close();
m_socket->deleteLater();
}
// 当接收到服务器返回数据时,执行该函数
void TcpClient::onDataReceived()
{
QTcpSocket *m_socket = qobject_cast<QTcpSocket *>(sender());
if (m_socket) {
QByteArray responseData = m_socket->readAll();
// 解析responseData
}
}
// 当连接服务器成功时,执行该函数
void TcpClient::onConnected()
{
QTcpSocket *m_socket = qobject_cast<QTcpSocket *>(sender());
if (m_socket) {
// 连接成功,可以做一些其他操作或者发送数据
}
}
// 当从服务器断开连接时,执行该函数
void TcpClient::onDisconnected()
{
QTcpSocket *m_socket = qobject_cast<QTcpSocket *>(sender());
if (m_socket) {
// 断开连接,可以做一些其他操作
m_socket->close();
m_socket->deleteLater();
}
}
// 当发生错误时,执行该函数
void TcpClient::onError(QAbstractSocket::SocketError socketError)
{
QTcpSocket *m_socket = qobject_cast<QTcpSocket *>(sender());
if (m_socket) {
qDebug() << "socket error: " << socketError;
// 发生错误,可以做一些其他操作
m_socket->close();
m_socket->deleteLater();
}
}
```
阅读全文