可以使用Qt的信号槽机制来实现保持接收状态。具体步骤如下:
- 在客户端程序中创建一个QTcpSocket对象,并连接到服务器。
QTcpSocket *clientSocket = new QTcpSocket(this);
clientSocket->connectToHost(QHostAddress("127.0.0.1"), 8888);
- 在客户端程序中定义一个槽函数,用于接收服务器传来的数据。
void Client::receiveData()
{
QByteArray data = clientSocket->readAll();
// 处理接收到的数据
}
- 将TCP socket的readyRead()信号与槽函数绑定,当有数据可读时,自动触发槽函数。
connect(clientSocket, SIGNAL(readyRead()), this, SLOT(receiveData()));
- 在客户端程序中使用while循环使其一直处于接收状态。
while (true)
{
QCoreApplication::processEvents(); // 让Qt程序处理事件
}
完整代码示例:
#include <QtCore/QCoreApplication>
#include <QTcpSocket>
class Client : public QObject
{
Q_OBJECT
public:
explicit Client(QObject *parent = nullptr)
: QObject(parent)
{
connect(clientSocket, SIGNAL(readyRead()), this, SLOT(receiveData()));
clientSocket->connectToHost(QHostAddress("127.0.0.1"), 8888);
}
private slots:
void receiveData()
{
QByteArray data = clientSocket->readAll();
// 处理接收到的数据
}
private:
QTcpSocket *clientSocket = new QTcpSocket(this);
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Client client;
while (true)
{
QCoreApplication::processEvents(); // 让Qt程序处理事件
}
return a.exec();
}
在上述代码中,客户端将一直处于接收状态,当有数据可读时,自动触发receiveData()槽函数对数据进行处理。同时,使用QCoreApplication::processEvents()让Qt程序处理事件,防止其它的事件被忽略。